elasticsearch前缀查询多个单词来解决自动完成用例

use*_*571 8 search autocomplete elasticsearch

如何使用弹性搜索来解决具有多个单词的简单自动完成用例?

假设我有一个带有以下标题的文档 - 弹性搜索是一个很好的搜索工具,建立在lucene之上.

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

{
    "prefix" : { "title" : "Elas" }
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "prefix" : { "title" : "Elastic sea" }
}
Run Code Online (Sandbox Code Playgroud)

我没有结果.

我需要构造什么类型的查询,以便向用户呈现简单自动完成用例的结果.

jav*_*nna 13

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

使用类似答案的布尔查询,您不会考虑术语的位置.作为结果,您将得到以下文档,例如:

弹性模型是存储Moose对象并搜索它们的框架.

出于自动完成目的,您可能希望进行短语查询并使用最后一个术语作为前缀.这是在匹配查询中使用match_phrase_prefix类型开箱即用的,它完全适用于您的用例:

{
    "match" : {
        "message" : {
            "query" : "elastic sea",
            "type" : "phrase_prefix"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此查询,您的示例文档将匹配,但我的不会因为elastic不接近search那里.


use*_*571 6

要获得该结果,您将需要使用布尔查询。部分单词需要是前缀查询,完整的单词或短语需要位于匹配子句中。查询还可以进行其他调整,例如“必须应该”等,可以根据需要应用。

{
    "query": {
        "bool": {
            "must": [
                {
                    "prefix": {
                        "name": "sea"
                    }
                },
                {
                    "match": {
                        "name": "elastic"
                    }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)