elasticsearch 如何处理多字文本的自动完成?
我的输入文本是多词英语文本,我需要为该文本实现自动补全功能 我最初查看search only是为了找出那些只能匹配输入的第一个字符。这对于自动完成产品名称或地址很好,但在需要自动完成输入文本中的任何单词时并不十分有用 之后,我设置了一个edge\u ngram分析器并查询以定位包含输入字符串的文档。这很好,但我不知道如何使用这些信息为我的自动完成提供选项 我可以使用a来显示与查询匹配的单词。这些数据可以反过来用于设置选项列表。这个解决方案似乎有点老套,也不是很优雅,我想知道这个问题通常是如何解决的elasticsearch 如何处理多字文本的自动完成?,elasticsearch,autocomplete,elasticsearch,Autocomplete,我的输入文本是多词英语文本,我需要为该文本实现自动补全功能 我最初查看search only是为了找出那些只能匹配输入的第一个字符。这对于自动完成产品名称或地址很好,但在需要自动完成输入文本中的任何单词时并不十分有用 之后,我设置了一个edge\u ngram分析器并查询以定位包含输入字符串的文档。这很好,但我不知道如何使用这些信息为我的自动完成提供选项 我可以使用a来显示与查询匹配的单词。这些数据可以反过来用于设置选项列表。这个解决方案似乎有点老套,也不是很优雅,我想知道这个问题通常是如何解决
不幸的是,我无法维护另一个字段,其中可能包含文档的自动完成选项。我认为您最好的选择是创建一个专用索引,使用edge\n ngram analyzer仅存储建议。如果您使用完成建议,您仍然需要明确定义您的实际建议。在ES 5.x中,完成建议器也是以文档为中心的,因此,如果您使用相同的建议为多个文档编制索引,则会在匹配中返回重复的建议。ES 6中有一个重复数据消除选项,但该选项刚刚发布
如果您有一个专用的建议索引,您可以使用建议的哈希作为文档ID,以避免重复。您可以开始索引文档标题和其他有用的元数据作为建议。稍后,您可以包括用户输入的历史搜索,这些搜索由于用户最终单击或购买返回的结果而被视为成功 我目前正在使用查询的突出显示信息来构造自动完成选项 我的问题是:
{
"query": {
"match": {
"fields.content.auto": {
"query": "content co",
"analyzer": "standard"
}
}
},
"highlight": {
"fields": {
"fields.content.auto": {
"fragment_size": 0,
"number_of_fragments": 10,
"pre_tags" : [ "%ha%" ],
"post_tags" : [ "%he%" ]
}
}
},
"_source": ["uuid", "language"]
}
我的自动字段使用了autocomplete
分析器
"auto": {
"type": "string",
"analyzer": "autocomplete"
}
这是我正在使用的索引配置:
{
"analysis": {
"filter": {
"my_stop": {
"type": "stop",
"stopwords": "_english_"
},
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_stop",
"autocomplete_filter"
]
}
}
}
}
这个解决方案主要是受这篇文章的启发
我处理响应JSON以获得自动完成选项。
突出显示信息用于提取所有找到的令牌。接下来,通过将这些标记与用户已经输入的短语进行比较,来构造潜在的自动完成短语。最妙的是,可以应用停止词过滤器,因此停止词将永远不会突出显示,反过来也永远不会用于自动完成建议
可以找到该处理器的PoC Java代码
我还不确定是否会使用此解决方案运行,但我还是想分享它。我倾向于同意这种方法,但在这种情况下,我需要自己维护索引,或者至少为我的应用程序用户提供一种维护索引的方法。用户只需要自动完成。我找到了另一个选择。我将发布一个答案。我正在评估一个项目的几个自动完成选项。由于不需要支持额外索引的简单性,我也可以尝试您的方法。美好的我想,对我来说,创建一个重复的可搜索字段并应用边缘图所占用的额外空间可能是一个问题,但这仍然是一个有趣的方法。