要使用Solr實現某種程度的容錯,我已經開始使用。下面是從schema.xml
的野趣位:僅返回與Solr匹配足夠的NGrams的結果
<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
字段中的標記化查詢或text_ngram
字段中的一個NGrams。使用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
如果我沒有理解錯這意味着要麼
- 其中的n-gram的需要匹配或
- 原查詢(標記化)需要匹配
現在,這也會找到像「以太網」這樣的項目作爲NGrams之一(eth
)是一樣的。
我的問題是:如何爲NGram比賽設置更高的門檻?有沒有辦法說「只有在查詢中至少有90%的NGrams匹配時才返回該項目」?確保100%的NGrams匹配沒有意義,因爲這會有效地消除容錯。
我想到的另一種方式是僅返回高於某個得分閾值的結果,而不是最高結果。這是因爲與「以太網」相比,「某物」的相關性非常高。那麼有沒有辦法掛鉤到Solr只返回例如有結果。最高成績的至少1/100分?我讀到有一種方法可以提供自定義HitCollector
,但我無法真正找到關於此的任何信息。
謝謝!
爲什麼在查詢時使用ngrams?什麼是匹配部分搜索條件的用例?通常ngrams用於前綴匹配/更快的通配符匹配。 – Jayendra
你留下的是[min match parameter](http://wiki.apache.org/solr/ExtendedDisMax#mm_.28Minimum_.27Should.27_Match.29)。請閱讀警告:yellow {!} – aitchnyu
@Jayendra:這個想法是實現某種容錯搜索。當有人搜索「someting」時,它應該找到「某事」。我認爲NGrams應該是可能的。我知道有模糊搜索(〜),但我沒有真的找到一種方法來實現這與EDisMax查詢處理程序,因爲我將不得不附加〜到每個單詞。任何指針? –