使用 elasticsearch completion suggester 获得不同于输入的输出

Get an output different from input with elasticsearch completion suggester

我最近从 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",我想得到 "Series/Genre/Fantasy" 和 "Books/Genre/Fantasy" 类别的 URI 作为响应。

以前使用 ES 1.4,我能够为给定的输入创建一个具有不同输出的完成建议器,所以我这样索引我的建议器:

{
    "suggest" : {
        "input": [ "Fantasy"],
        "output": "Series/Genre/Fantasy"
    }
}

{
    "suggest" : {
        "input": [ "Fantasy"],
        "output": "Books/Genre/Fantasy"
    }
}

但是在 ES 5.4 中,完成建议的输出 属性 不再存在,所以我在响应中得到的只是建议字段的 input 属性,这是标签 "Fantasy",但我想要 URI。

现在,我的解决方法是查找在响应的 _source 属性 中返回的每个文档的 categories 字段,并过滤具有标签的类别从输入 "Fant" 开始。这是非常低效的,因为我需要将每个返回文档的每个类别映射到它的标签以检查输入。

难道没有更有效的方法来使用 ES suggesters 吗?我错过了什么?

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

希望对您有所帮助。