Searchkick 词干

Searchkick stemming

使用 searchkick 并查看 "animals" 的搜索返回 "anime" 的结果,因为它们的词干 "anim"。有人对如何改进这些结果有什么建议吗?

我在文档中看到你可以做类似的事情

exclude_queries = {
  "animals" => ["anime"],
}

Product.search query, exclude: exclude_queries[query]

但是,为所有像这样的不良事件保留一个 运行 列表似乎需要做很多工作。

想知道我是否需要更改词干分析器?

看起来你使用的是使用词干分析器的 english 分析器,而不是不会以某种方式阻止令牌的标准分析器,导致如下所示的词干令牌:

POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze

{
    "text" : "animals",
    "analyzer" : "english"
}

{
    "tokens": [
        {
            "token": "anim",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

标准分析器(文本字段默认)生成非词干标记

{
    "text" : "animals",
    "analyzer" : "standard"
}

{
    "tokens": [
        {
            "token": "animals",
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

如果您使用标准分析器,您将不会生成词干形式,但 running 将不会生成 run 词干形式来标记,并且搜索 running 将不会生成 runruns 等。这是一种权衡,根据您的业务需求,您需要选择和修改分析器。

我可能会尝试这样的事情。 https://www.elastic.co/guide/en/elasticsearch/reference/master/mixing-exact-search-with-stemming.html

更新

searchkick gem 的 Ankane 非常友好地添加了一个功能来帮助解决这个问题。从 4.4.1 开始,您可以这样做。

class Product < ApplicationRecord
  searchkick stemmer_override: ["anime => anime"]
end

这将防止 "anime" 被词干化为 "anim"。所以它不会出现在 "animals" 搜索结果中。