11

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

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

因此,如果我使用前缀查询并使用以下形式构造它 -

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

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

但是,如果我进行前缀搜索

{
    "prefix" : { "title" : "Elastic sea" }
}

我没有得到任何结果。

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

4

2 回答 2

17

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

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

弹性模型是一个框架来存储你的 Moose 对象并通过它们进行搜索。

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

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

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

于 2013-07-17T11:42:02.170 回答
4

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

{
    "query": {
        "bool": {
            "must": [
                {
                    "prefix": {
                        "name": "sea"
                    }
                },
                {
                    "match": {
                        "name": "elastic"
                    }
                }
            ]
        }
    }
}
于 2013-07-17T04:05:48.613 回答