2013-07-01 40 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查询处理程序,因为我将不得不附加〜到每个单词。任何指针? –

回答