我的文档中有name_en、name_de、name_fr等字段,英语中有 cutter,德文中有 mutter。如果我用name_en:cuter~1(只有一个t)进行模糊搜索,它会运行良好,但如果我搜索name_de:muter~1,它就不会返回任何结果。
然而,它与模糊距离2一起工作。因此name_de:muter~2工作正确,并返回mutter。这两种语言在schema.xml中有不同的分析器,所以这应该是区别。但仍然不清楚为什么德语的距离1不起作用。
下面是德语的配置。
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.ManagedStopFilterFactory" managed="de" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ShingleFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
<filter class="solr.GermanStemFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
有人能解释一下为什么距离是2,而不是1吗?正如我所观察到的,mu* t er和mut*er之间的距离是1,而不是2。
1条答案
按热度按时间a5g8bdjr1#
发生这种情况是因为
mutter
被德语词干分析器截断,并被索引为mutt
,其中cutter
似乎没有被大多数英语词干分析器所触及(用Porter和Snowball/Porter 2算法测试,已知是最激进的):cuter
与cutter
匹配的编辑距离为1。muter
与mutt
匹配的编辑距离为2。为了使模糊搜索按预期工作,您需要在分析链中保留原始(无词干)标记,以便它们也被索引,从而可以在查询时由距离算法正确匹配。
一个简单的解决方案是使用KeywordRepeatFilterFactory,将其放在词干分析器之前,以便保留无词干标记,并在与有词干标记相同的位置索引。否则,您必须使用特定的字段类型。
出于同样的原因,您可能也有相同类型的issues with wildcard queries,解决方案也是相同的。
注意:我注意到你使用的是一个瓦片过滤器,把关键字repeater***放在瓦片过滤器的***之后是很重要的,这样重复的单字就可以被词干化,重复的瓦片就可以被重复过滤器删除,否则瓦片就会由重复的关键字组成。