使用elasticsearch完成建议器

时间:2017-08-01 14:16:44

标签: elasticsearch elasticsearch-5 search-suggestion

我最近从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建议者是不是有更有效的方法呢?我错过了什么?

1 个答案:

答案 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"
            }
        }
    }
}

我希望这会有所帮助。