【问题标题】:elasticsearch prefix query for multiple words to solve the autocomplete use caseelasticsearch前缀查询多个词解决自动完成用例
【发布时间】:2025-04-22 22:35:01
【问题描述】:

如何让弹性搜索工作以解决包含多个单词的简单自动完成用例?

假设我有一个标题如下的文档 - Elastic search 是一个建立在 lucene 之上的出色搜索工具。

因此,如果我使用前缀查询并使用表单构造它 -

{
    "prefix" : { "title" : "Elas" }
}

它将在结果集中返回该文档。

但是,如果我对

进行前缀搜索
{
    "prefix" : { "title" : "Elastic sea" }
}

我没有得到任何结果。

我需要构建什么样的查询,以便向用户呈现简单自动完成用例的结果。

【问题讨论】:

    标签: search autocomplete elasticsearch


    【解决方案1】:

    要实现该结果,您需要使用布尔查询。部分词需要是前缀查询,完整的词或短语需要在匹配子句中。查询还有其他可用的调整,例如 must should 等,可以根据需要应用。

    {
        "query": {
            "bool": {
                "must": [
                    {
                        "prefix": {
                            "name": "sea"
                        }
                    },
                    {
                        "match": {
                            "name": "elastic"
                        }
                    }
                ]
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      Elastic sea 上进行的前缀查询将匹配索引中类似Elastic search 的术语,但如果您对空格进行标记,则不会出现在索引中。您拥有的是 elasticsearch 作为两个不同的令牌。查看analyze api,了解您实际上是如何为文本编制索引的。

      在您的答案中使用布尔查询,您不会考虑术语的位置。例如,您将获得以下文档:

      弹性模型是一个框架来存储你的 Moose 对象和搜索 通过他们。

      出于自动完成的目的,您可能需要进行短语查询并使用最后一个词作为前缀。可以使用 match query 中的 match_phrase_prefix 类型开箱即用,该类型完全适用于您的用例:

      {
          "match" : {
              "message" : {
                  "query" : "elastic sea",
                  "type" : "phrase_prefix"
              }
          }
      }
      

      使用此查询,您的示例文档将匹配,但我的不匹配,因为 elasticsearch 不接近。

      【讨论】:

      • 我应该澄清一下,这是我的错误。术语的位置对我来说并不重要,因为我只看标题而不是整个描述。如果我在您的示例中搜索 Elastic Moos,phrase_prefix 查询不会返回结果吗?
      • 不,不会的!我提出的查询考虑了术语的位置,并且仅扩展了将其视为前缀的最后一个。