我的输入文本是多字英文文本,我需要为该文本实现自动完成功能。
我最初查看了搜索 completion suggesters只是为了弄清楚这些只能匹配输入的第一个字符。这对于自动完成产品名称或地址来说很好,但在需要自动完成输入文本中的任何单词时不是很有用。
之后,我设置了 edge_ngram 分析器并查询以找到包含输入字符串的文档。这工作得很好,但我不知道如何使用这些信息来提供自动完成选项。
我可以使用highlighter以显示与查询匹配的单词。这些数据又可以用来设置选项列表。这个解决方案看起来相当老套而且不是很优雅,我想知道这个问题通常是如何解决的?
不幸的是,我无法维护另一个可能包含文档自动完成选项的字段。
最佳答案
我当前正在使用查询的突出显示信息来构建自动完成选项。
我的查询:
{
"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"]
}
我的自动字段使用了自动完成
分析器。
"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"
]
}
}
}
}
该解决方案主要受到 Search-as-you-type 帖子的启发。
我处理响应 JSON 以获得自动完成选项。 突出显示信息用于提取所有找到的标记。接下来,这些标记还用于通过将其与用户已输入的短语进行比较来构造潜在的自动完成短语。巧妙的是,可以应用停用词过滤器,因此停用词永远不会突出显示,从而永远不会用于自动完成建议。
可以在here找到该处理器的PoC Java代码
我还不确定是否会使用这个解决方案,但无论如何我想分享它。
关于elasticsearch - 如何处理多字文本的自动完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250772/