【问题标题】:Fuzzy search with 1 distance does not works for other languages in Solr距离为 1 的模糊搜索不适用于 Solr 中的其他语言
【发布时间】:2022-11-13 00:30:53
【问题描述】:

我有包含 name_en、name_de、name_fr 等字段的文档。还有单词tt用英语和tt在德国。如果我用 name_en:cu 进行模糊搜索er~1(只有一个 t)它工作正常,但如果我搜索 name_de:muer~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 之间的距离tt呃和穆er 是 1,而不是 2。

【问题讨论】:

  • 您是否检查了分析页面上创建的令牌? GermanStemFilterFactory 是否产生了任何问题?
  • @AbhijitBashetti 不,我没有。我如何通过查询输出这些标记以查看它为什么不起作用?是的,我已经用英文过滤器替换了这个过滤器,并且它像英文一样工作。但我仍然不明白为什么这个过滤器后的距离是 2。

标签: solr lucene levenshtein-distance fuzzy-search


【解决方案1】:

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

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

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

为了使模糊搜索按预期工作,您需要在分析链中保留原始(未提取的)标记,以便它们也被索引,从而可以在查询时被距离算法正确匹配。

一个简单的解决方案是使用放在词干分析器之前的KeywordRepeatFilterFactory,以便保留未词干标记并在与词干标记相同的位置进行索引。否则,您将不得不使用特定的字段类型。

出于同样的原因,您可能也有相同类型的issues with wildcard queries,并且解决方案将是相同的。


NB。我注意到您正在使用 shingle 过滤器,放置关键字重复器很重要shingle 过滤器,以便重复的 unigrams 可以被阻止并通过重复过滤器删除重复的 shingles,否则 shingles 将由重复的关键字组成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-05-15
    • 1970-01-01
    • 2021-10-18
    • 2013-02-18
    • 2022-10-07
    • 2020-02-22
    相关资源
    最近更新 更多