为了使用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
字段中的标记化查询或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
如果我读得对,那就意味着要么
现在这也会发现像“以太网”这样的项目,因为其中一个NGrams(eth
)是相同的。
我的问题是:如何为NGram比赛设置更高的门槛?有没有办法说“如果查询中至少有90%的NGrams匹配,则只返回项目”?确保100%的NGrams匹配是没有意义的,因为这会有效地破坏容错。
我想到的另一种方法是仅返回相对于最高结果超过某个分数阈值的结果。这是因为与“以太网”相比,项目“某物”具有非常高的相关性。那么有没有办法挂钩到Solr只返回有例如的结果。至少是最高成绩的1/100?我读到有一种方法可以提供自定义HitCollector
但我无法找到任何关于此的信息。
谢谢!
答案 0 :(得分:0)
这个想法是为了实现某种容错搜索。当有人搜索“某些”时,它应该找到“某事”
Solr的SpellChecker进行模糊搜索,您可以在其上设置阈值http://wiki.apache.org/solr/SpellCheckComponent。