2013-07-01 49 views
1

要使用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 

如果我沒有理解錯這意味着要麼

  1. 其中的n-gram的需要匹配或
  2. 原查詢(標記化)需要匹配

現在,這也會找到像「以太網」這樣的項目作爲NGrams之一(eth)是一樣的。

我的問題是:如何爲NGram比賽設置更高的門檻?有沒有辦法說「只有在查詢中至少有90%的NGrams匹配時才返回該項目」?確保100%的NGrams匹配沒有意義,因爲這會有效地消除容錯。

我想到的另一種方式是僅返回高於某個得分閾值的結果,而不是最高結果。這是因爲與「以太網」相比,「某物」的相關性非常高。那麼有沒有辦法掛鉤到Solr只返回例如有結果。最高成績的至少1/100分?我讀到有一種方法可以提供自定義HitCollector,但我無法真正找到關於此的任何信息。

謝謝!

+0

爲什麼在查詢時使用ngrams?什麼是匹配部分搜索條件的用例?通常ngrams用於前綴匹配/更快的通配符匹配。 – Jayendra

+0

你留下的是[min match parameter](http://wiki.apache.org/solr/ExtendedDisMax#mm_.28Minimum_.27Should.27_Match.29)。請閱讀警告:yellow {!} – aitchnyu

+0

@Jayendra:這個想法是實現某種容錯搜索。當有人搜索「someting」時,它應該找到「某事」。我認爲NGrams應該是可能的。我知道有模糊搜索(〜),但我沒有真的找到一種方法來實現這與EDisMax查詢處理程序,因爲我將不得不附加〜到每個單詞。任何指針? –

回答