如何使用弹性搜索来解决具有多个单词的简单自动完成用例?
假设我有一个带有以下标题的文档 - 弹性搜索是一个很好的搜索工具,建立在lucene之上。
因此,如果我使用前缀查询并使用表单
构造它{
"prefix" : { "title" : "Elas" }
}
它将在结果集中返回该文档。
但是,如果我进行前缀搜索
{
"prefix" : { "title" : "Elastic sea" }
}
我没有结果。
我需要构造什么类型的查询,以便向用户呈现简单自动完成用例的结果。
答案 0 :(得分:12)
在Elastic sea
上进行的前缀查询将匹配索引中的Elastic search
这样的术语,但如果您在空格上进行标记,则不会出现在索引中。您拥有的是elastic
和search
两种不同的令牌。请查看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"
}
}
]
}
}
}