Solr である程度のフォールト トレランスを実現するために、NGramFilterFactory
. からの興味深いビットは次のschema.xml
とおりです。
<field name="text" type="text" indexed="true" stored="true"/>
<copyField source="text" dest="text_ngram" />
<field name="text_ngram" type="text_ngram" indexed="true" stored="false"/>
<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="3" />
</analyzer>
</fieldType>
私はEDisMax
ほとんどストック構成でクエリハンドラーを使用しています。の興味深い行を次に示しますsolrconfig.xml
。
<requestHandler name="/browse" class="solr.SearchHandler">
<lst name="defaults">
<!-- Query settings -->
<str name="defType">edismax</str>
<str name="qf">
name name_ngram^0.001
</str>
<str name="mm">100%</str>
<str name="q.op">AND</str>
...
これは問題なく動作しますが、多くの無関係な結果が得られます。Solr の分析機能を使用して、問題を次の原因まで追跡したと思います。
クエリは NGrams に分割されます。次に、Solr は、フィールド内のトークン化されたクエリtext
またはフィールド内の NGram のいずれかを検索しtext_ngram
ます。を使用すると、「something」を検索するときdebug=query
に次のように出力されます。parsedquery
(+DisjunctionMaxQuery(((text_ngram:som text_ngram:ome text_ngram:met text_ngram:eth text_ngram:thi text_ngram:hin text_ngram:ing) | text:something)))/no_coord
私がこれを正しく読んだ場合、それは次のいずれかを意味します
- NGram の 1 つが一致する必要があります。
- 元のクエリ (トークン化) が一致する必要があります
これで、NGrams ( eth
) の 1 つが同じであるため、「ethernet」などの項目も検索されます。
私の質問は次のとおりです。NGram 一致のしきい値を高く設定するにはどうすればよいですか? 「クエリの NGrams の少なくとも 90% が一致する場合にのみアイテムを返す」と言う方法はありますか? NGrams の 100% が一致することを確認することは、フォールト トレランスを実質的に無効にするため意味がありません。
私が考えたもう 1 つの方法は、上位の結果に対して特定のスコアしきい値を超える結果のみを返すことでした。これは、項目「something」が「ethernet」に比べて関連性が非常に高いためです。だから、Solrにフックして、例えば. 最上位のスコアの少なくとも 1/100 ですか? カスタムを提供する方法があることを読みましたが、HitCollector
これに関する情報を実際に見つけることができませんでした。
ありがとう!