【问题标题】:prefix autocomplete suggestion elasticsearch前缀自动完成建议 elasticsearch
【发布时间】:2024-12-09 17:20:02
【问题描述】:

我正在尝试使用 ElasticSearch 实现前缀自动完成功能,这是我对建议字段的映射:

PUT vdpinfo
{
    "mappings": {
        "details" : {
            "properties" : {
                "suggest" : {
                    "type" : "completion"
                },
                "title": {
                  "type": "keyword"
                }
            }
        }
    }
}

并且我用单字和双字(bigram)索引了一些数据,例如:

{"suggest": "leather"}

还有:

{"suggest": "leather seats"}
{"suggest": "2 leather"}

我的搜索查询是这样的:

GET /vdpinfo/details/_search
{
        "suggest": {
            "feature-suggest": {
                "prefix": "leather",
                "completion": {
                    "field": "suggest"
                }
            }
        }
    }

但是结果返回{"suggest": "leather"}{"suggest": "2 leather"},更重要的是,{"suggest": "2 leather"}的排名高于leather

我的问题是为什么 2 leather 会被返回,为什么它不像查询中那样只执行 prefix 自动完成。 prefix: leather?

【问题讨论】:

    标签: elasticsearch autocomplete


    【解决方案1】:

    这是因为用于分析数据的默认分析器是 simple 分析器,只要遇到非字母字符,它就会简单地将文本分解为术语,因此 2 leather 实际上被索引为 @987654325 @,因此为什么显示结果(以及为什么首先显示)。

    他们默认使用 simple 分析器而不是 standard 的原因是不提供基于停用词 (explanation here) 的建议。

    因此,如果您改用standard 分析器,您将不会收到任何关于2 leather 的建议

    PUT vdpinfo
    {
        "mappings": {
            "details" : {
                "properties" : {
                    "suggest" : {
                        "type" : "completion",
                        "analyzer" : "standard"
                    },
                    "title": {
                      "type": "keyword"
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 工作得很好。非常感谢您的解释。
    • 酷,很高兴它有帮助!