距离为1的模糊搜索不适用于Solr中的其他语言

nfzehxib  于 2022-11-23  发布在  Solr
关注(0)|答案(1)|浏览(201)

我的文档中有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。

a5g8bdjr

a5g8bdjr1#

发生这种情况是因为mutter被德语词干分析器截断,并被索引为mutt,其中cutter似乎没有被大多数英语词干分析器所触及(用Porter和Snowball/Porter 2算法测试,已知是最激进的):

  • cutercutter匹配的编辑距离为1。
  • mutermutt匹配的编辑距离为2。

为了使模糊搜索按预期工作,您需要在分析链中保留原始(无词干)标记,以便它们也被索引,从而可以在查询时由距离算法正确匹配。
一个简单的解决方案是使用KeywordRepeatFilterFactory,将其放在词干分析器之前,以便保留无词干标记,并在与有词干标记相同的位置索引。否则,您必须使用特定的字段类型。
出于同样的原因,您可能也有相同类型的issues with wildcard queries,解决方案也是相同的。
注意:我注意到你使用的是一个瓦片过滤器,把关键字repeater***放在瓦片过滤器的***之后是很重要的,这样重复的单字就可以被词干化,重复的瓦片就可以被重复过滤器删除,否则瓦片就会由重复的关键字组成。

相关问题