使用 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"
}
}
}
}
希望对您有所帮助。
我最近从 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"
}
}
}
}
希望对您有所帮助。