2

音声一致の結果が通常の一致よりも重み付けされないように、インデックス作成を設定したいと考えています。

これを行うために、テキスト用に schema.xml に 2 つの異なる fieldType セットを作成しました。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
  </analyzer>
</fieldType>
<fieldType name="text_phonetic" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
  </analyzer>
</fieldType>

音声ファクトリを使用する dynamcicField を作成しました。

<dynamicField name="*_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>

私のモデルでは、次のようなことができます。

text :name, :as => :name_phonetic

そしてそれはうまくいきます。

私の質問は、多くのフィールドを設定して、通常のテキスト フィールド インデックスと音声フィールド インデックスの両方を使用し、最初のものよりも高いブーストを使用するための最良の方法は何ですか? モデル内のすべてのインデックス行を複製することはできますが、構造体を使用してスキーマ内でこれを直接実行し、それを太陽黒点のフルテキスト クエリで使用できるようにする方法はありますか?

4

1 に答える 1

2

お気づきのとおりsearchable、複数の異なる方法でインデックスを作成するフィールドのブロック内の行を複製できます。:boost実際には、フィールドの粒度をより細かく維持し(以下に示すように)、インラインオプションのような優れたSunspotヘルパーがあるため、これを実際にお勧めします。

そうは言ってもcopyField、スキーマでSolrのディレクティブを利用することもできます。これは次のようになります。

<copyField source="source_field" dest="dest_field" maxChars="N" />

ソースフィールド名はパターンの場合がありますが、宛先は単一のフィールドである必要があります。fieldさらに、宛先は、に一致する名前ではなく、独自の宛先として定義する必要があると思いますdynamicField

これらの制約を考慮すると、スキーマに次のようなものを設定できます。

<fields>
  ...
  <field name="all_text_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>
  ...
</fields>

<copyField source="*_text" dest="all_text_phonetic" />
<copyField source="*_texts" dest="all_text_phonetic" />

copyFieldフィールドの粒度を維持するために、着信フィールドごとにディレクティブを設定できます。ただし、ブロック内に個別の行を作成する場合よりも、間違いなく重複が多くsearchableなります。

だから、それはトサップです。しかし、それらはあなたの選択肢です。

于 2011-08-20T22:26:11.410 に答える