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

时间:2013-07-17 01:46:02

标签: search autocomplete elasticsearch

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

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

因此,如果我使用前缀查询并使用表单

构造它
{
    "prefix" : { "title" : "Elas" }
}

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

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

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

我没有结果。

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

2 个答案:

答案 0 :(得分:12)

Elastic sea上进行的前缀查询将匹配索引中的Elastic search这样的术语,但如果您在空格上进行标记,则不会出现在索引中。您拥有的是elasticsearch两种不同的令牌。请查看analyze api,了解您实际为文本建立索引的方式。

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

  

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

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

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

使用此查询,您的示例文档会匹配,但由于elastic不在search附近,因此我不会这样做。

答案 1 :(得分:2)

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

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