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