0

使用 searchkick 并查看搜索"animals"返回的结果是"anime"因为它们的 stem "anim"。有人对如何改善这些结果有任何建议吗?

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

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

Product.search query, exclude: exclude_queries[query]

但是,为所有像这样的坏人保留一份运行列表似乎需要做很多工作。

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

4

2 回答 2

1

看起来不是标准分析器,它不会以某种方式阻止令牌,而您正在使用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。这是一种权衡,根据您的业务需求,您需要选择和修改分析器.

于 2020-06-23T05:38:53.260 回答
0

我可能会尝试这样的事情。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"搜索结果中。

于 2020-06-23T15:59:09.647 回答