我最近从Elasticsearch 1.4升级到了5.4,并且正在努力高效地迁移自动完成查询。问题是我想要一个完成建议器,其中输出与输入不同。
我存储的文档有一个类别字段,该类别基本上是带有URI的字符串数组(因为它们形成一棵树)。URI的最后一部分,我称之为“标签”,是完成提示器中的输入,但是作为响应,我想检索完整的URI。
假设我有两个文件:
{
"name" : "Lord of The Rings",
"categories" : ["Books/Genre/Fantasy", "Books/Language/English"]
}
Run Code Online (Sandbox Code Playgroud)
和
{
"name" : "Game of Thrones",
"categories" : ["Series/Genre/Fantasy", "Series/Host/HBO"]
}
Run Code Online (Sandbox Code Playgroud)
我的输入是“ Fant”,我想作为响应获得“系列/类型/幻想”和“书籍/类型/幻想”类别的URI。
在以前的ES 1.4中,我能够为给定的输入创建具有不同输出的完成提示,因此我对索引的建议如下:
{
"suggest" : {
"input": [ "Fantasy"],
"output": "Series/Genre/Fantasy"
}
}
Run Code Online (Sandbox Code Playgroud)
和
{
"suggest" : {
"input": [ "Fantasy"],
"output": "Books/Genre/Fantasy"
}
}
Run Code Online (Sandbox Code Playgroud)
但是在ES 5.4中,对于完成提示者来说,输出属性不再存在,因此,我在响应中得到的只是input我的“建议”字段的属性,即“ Fantasy”标签,但是我需要URI。
现在,我的解决方法是在响应categories的_source属性中查找返回的每个文档的字段,并过滤具有以输入“ Fant”开头的标签的类别。这是非常低效的,因为我需要将每个返回文档的每个类别映射到其标签中以检查输入。
使用ES建议者没有更有效的方法吗?我想念什么?