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索引中的术语,但如果您在空格上进行标记,则不会出现在索引中.你有什么是elastic和search两个不同的令牌.查看analyze api,了解如何实际索引文本.
使用类似答案的布尔查询,您不会考虑术语的位置.作为结果,您将得到以下文档,例如:
弹性模型是存储Moose对象并搜索它们的框架.
出于自动完成目的,您可能希望进行短语查询并使用最后一个术语作为前缀.这是在匹配查询中使用match_phrase_prefix类型开箱即用的,它完全适用于您的用例:
{
"match" : {
"message" : {
"query" : "elastic sea",
"type" : "phrase_prefix"
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此查询,您的示例文档将匹配,但我的不会因为elastic不接近search那里.
要获得该结果,您将需要使用布尔查询。部分单词需要是前缀查询,完整的单词或短语需要位于匹配子句中。查询还可以进行其他调整,例如“必须应该”等,可以根据需要应用。
{
"query": {
"bool": {
"must": [
{
"prefix": {
"name": "sea"
}
},
{
"match": {
"name": "elastic"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9537 次 |
| 最近记录: |