我最近从Elasticsearch 1.4升级到5.4,我正在努力有效地迁移自动填充查询。问题是我想要一个完成建议器,其输出与输入不同。
我存储的文档有一个类别字段,它基本上是一个带有URI的字符串数组(因为它们构成了一个树)。 URI的最后一部分,我称之为标签,是完成建议器中的输入,但作为响应,我想检索完整的URI。
所以我想说我有两份文件:
{
"name" : "Lord of The Rings",
"categories" : ["Books/Genre/Fantasy", "Books/Language/English"]
}
和
{
"name" : "Game of Thrones",
"categories" : ["Series/Genre/Fantasy", "Series/Host/HBO"]
}
我的输入是“Fant”,我希望得到“系列/流派/幻想”和“书籍/流派/幻想”类别的URI作为回应。
以前使用ES 1.4,我能够为给定的输入创建一个具有不同输出的完成建议器,因此我将我的建议索引为:
{
"suggest" : {
"input": [ "Fantasy"],
"output": "Series/Genre/Fantasy"
}
}
和
{
"suggest" : {
"input": [ "Fantasy"],
"output": "Books/Genre/Fantasy"
}
}
但是在ES 5.4中,输出属性不再存在于完成建议器中,所以我在响应中得到的是我建议字段的input
属性,这是标签“Fantasy”,但我想要URI。
现在,我的解决方法是查找响应的categories
属性中返回的每个文档的_source
字段,并过滤具有以输入“Fant”开头的标签的类别”。这是非常低效的,因为我需要将每个返回文档的每个类别映射到其标签中以检查输入。
使用ES建议者是不是有更有效的方法呢?我错过了什么?
答案 0 :(得分:5)
Elasticsearch的完成建议已从5.0更改。
删除索引建议条目时指定输出的支持。现在建议结果条目的文本始终是建议输入的未分析值(与在5.0之前的索引中索引建议时未指定输出相同)。
因此,您需要将output
添加为正文中suggest
键的兄弟字段。
这是它的样子:
映射:
{
"mappings": {
"<type>" : {
"properties" : {
"suggest" : {
"type" : "completion"
},
"output" : {
"type": "keyword"
}
}
}
}
}
不要忘记用您的索引类型替换<type>
。
索引:
/<index_name>/<type_name>
{
"suggest" : {
"input": ["Fantasy"],
"weight" : 1
},
"output": "Series/Genre/Fantasy"
}
此处,字段名称output
可以替换为任何内容,它只是文档的元数据。
查询:
/<index_name>/_search
{
"suggest": {
"show-suggest" : {
"prefix" : "Fant",
"completion" : {
"field" : "suggest"
}
}
}
}
我希望这会有所帮助。