Autocomplete ElasticSearch短语前缀搜索-如何获取匹配的短语?
我正在使用ElasticSearch构建一个自动完成功能。当用户输入时,我想显示数据中的完成列表,以便用户可以选择一个。例如,如果数据包含以下短语:Autocomplete ElasticSearch短语前缀搜索-如何获取匹配的短语?,autocomplete,elasticsearch,Autocomplete,elasticsearch,我正在使用ElasticSearch构建一个自动完成功能。当用户输入时,我想显示数据中的完成列表,以便用户可以选择一个。例如,如果数据包含以下短语: very unusual very unlikely very useful 以及用户类型: very u 我想显示上面的短语 我正在使用此查询: "query": { "multi_match": { "query": "very u", "fields": [ "name",
very unusual
very unlikely
very useful
以及用户类型:
very u
我想显示上面的短语
我正在使用此查询:
"query": {
"multi_match": {
"query": "very u",
"fields": [
"name",
"description",
"contentBlocks.caption",
"contentBlocks.text"
],
"type": "phrase_prefix",
"max_expansions": 10,
"cutoff_frequency": 0.001
}
这与我正在寻找的内容相匹配,但是从搜索结果中提取匹配的短语是相当尴尬的。我一直在使用突出显示,我通过分析突出显示来收集匹配的短语。例如:
"highlight": {
"contentBlocks.text": [
"turned the <em>very</em> <em>unusual</em> doorknob"
]
}
"highlight": {
"contentBlocks.text": [
"invented a <em>very</em> <em>useful</em> mechanism"
]
}
我使用snowball_stem analyzer进行搜索,使用shingle_analyzer进行自动完成功能。木瓦分析仪如下所示:
"settings" : {
"analysis" : {
"analyzer" : {
"shingle_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"filter" : [
"standard",
"lowercase",
"shingle_filter"
],
"char_filter" : [
"html_strip"
]
}
},
"filter" : {
"shingle_filter" : {
"type" : "shingle",
"min_shingle_size" : 2,
"max_shingle_size" : 2
}
}
}
},
短语建议者的文档似乎完全面向拼写更正,而不是完成。因为我要做的是完成,所以我将direct generator的min_word_length和prefix_length设置为输入文本的长度,在本例中为2
我根据文档编制了一个建议查询:
{
"text" : "sa",
"autocomplete_description" : {
"phrase" : {
"analyzer" : "standard",
"field" : "description.autocomplete",
"size" : 10,
"max_errors" : 2,
"confidence" : 0.0,
"gram_size" : 2,
"direct_generator" : [
{
"field" : "description.autocomplete",
"suggest_mode" : "always",
"size" : 10,
"min_word_length" : 2,
"prefix_length" : 2
}
]
}
}
}
搜索sa的建议会得到以下结果:
{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"autocomplete_description" : [ {
"text" : "sa",
"offset" : 0,
"length" : 2,
"options" : [ {
"text" : "say",
"score" : 0.012580795
}, {
"text" : "sa",
"score" : 0.01127677
}, {
"text" : "san",
"score" : 0.0106529845
}, {
"text" : "sad",
"score" : 0.008533429
}, {
"text" : "saw",
"score" : 0.008107899
}, {
"text" : "sam",
"score" : 0.007155634
} ]
} ]
}
我希望为输入sa找到以任意长度的sa开头的单词。为什么它只返回两个或三个字符的单词?为什么它只返回六个选项?我一直在使用的multi_match phrase_prefix查询可以找到许多以sa开头的较长单词,例如saving、sassy、safari和sala
当我搜索多词文本的建议时,例如在数据中多次出现的一个或多个词,它什么也找不到。多匹配短语前缀查询查找一个或多个、一个或多个、一个或多个、一个或你、一个或两个
我怎样才能让这个建议者做我想做的事呢?你们可以用它大致得到你们想要的东西。主要问题是它不再支持搜索。您可以通过添加一个来解决这个问题,但它只适用于过滤器,不考虑搜索文本 我所知道的获得最佳行为上下文感知搜索完成的唯一方法是执行以下操作: 创建一个建议字段,在该字段中,文本被标记化,因为您希望用户可以看到它,可能是标准分析器,也可能是添加一个2-shingle标记过滤器。 假设用户发出的不完整查询非常不完整。幕后问题搜索very,然后使用获取与搜索上下文匹配的列表术语,但限制使用include:un.*返回的术语。 由此产生的列表看起来[不同寻常、不太可能、不酷]。
这种方法的唯一问题,特别是在分片环境中,是有很多查询,而且你把一个非常高的基数字段拖到内存中。所以我不知道这是否切实可行。所以,也许最好还是带着完成建议回去。如果您尝试这两种方法中的任何一种,我很想听听您的经验。如果您有任何问题,请告诉我,或者我可以在我的答案中添加任何内容。我曾尝试使用短语提示器来实现这一点,但我没有取得多大成功。我在上面的问题描述中添加了关于我的实验的信息和更详细的问题。@davidhaimson短语suggester仅根据编辑距离提出建议。这就是为什么你只能得到很短的完成时间——编辑距离比节省时间要近得多。谢谢你的关注,@JnBrymn。我最终使用了我最初描述的代码,使用短语_前缀查询并对突出显示进行后处理。这看起来像一个黑客,但它工作可靠,性能出人意料地好。
{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"autocomplete_description" : [ {
"text" : "sa",
"offset" : 0,
"length" : 2,
"options" : [ {
"text" : "say",
"score" : 0.012580795
}, {
"text" : "sa",
"score" : 0.01127677
}, {
"text" : "san",
"score" : 0.0106529845
}, {
"text" : "sad",
"score" : 0.008533429
}, {
"text" : "saw",
"score" : 0.008107899
}, {
"text" : "sam",
"score" : 0.007155634
} ]
} ]
}