Search 弹性搜索中的自动完成匹配
因此,我在弹性搜索中有一个Search 弹性搜索中的自动完成匹配,search,elasticsearch,autocomplete,full-text-search,search-engine,Search,elasticsearch,Autocomplete,Full Text Search,Search Engine,因此,我在弹性搜索中有一个标识符字符串字段,其中包含D123、M1、T23等值 我正在尝试将autocomplete构建到该字段的搜索中,以便D12的查询可能匹配D12,D120,D121,…,D1210等 目前,我已经构建了一个定制的edge ngram过滤器和分析仪,如下所示: “过滤器”:{ “自动完成过滤器”:{ “类型”:“edgeNGram”, “最小克”:2, “最大克数”:10 } } “分析器”:{ “自动完成”:{ “类型”:“自定义”, “标记器”:“空白”, “过滤器”:
标识符
字符串字段,其中包含D123
、M1
、T23
等值
我正在尝试将autocomplete构建到该字段的搜索中,以便D12
的查询可能匹配D12
,D120
,D121
,…,D1210
等
目前,我已经构建了一个定制的edge ngram过滤器和分析仪,如下所示:
“过滤器”:{
“自动完成过滤器”:{
“类型”:“edgeNGram”,
“最小克”:2,
“最大克数”:10
}
}
“分析器”:{
“自动完成”:{
“类型”:“自定义”,
“标记器”:“空白”,
“过滤器”:{“小写”、“自动完成过滤器”}
}
}
在我的映射中,当索引时,我在标识符字段中使用它:
“标识符”:{
“类型”:“字符串”,
“分析器”:“自动完成”,
“搜索引擎分析器”:“标准”
}
这意味着为D1234
编制索引的NGRAM是D1
、D12
、D123
和D1234
要对此提出质疑,我的做法如下:
“查询”:{
“布尔”:{
“应该”:{
“匹配”:{
“标识符”:{
“查询”:“D12”,
“模糊性”:0
}
}
}
}
}
这将返回从最长到最短的结果,因此D12
显示在结果的末尾。我如何确保尽可能短的标识符具有最高的相关性分数
我的猜测是D12
查询与ngram的匹配是这样的:[{D12},{D12}3,{D12}34]
,弹性搜索是“哦,太好了,3个匹配!”而不是D12
结果将给出的1[{D12}]
我猜有一种解决方案可能没有部分匹配这些ngrams,因此弹性搜索可以看到两个结果的[{D12}]
,但排名D12
高于D1234
,因为它匹配的是ngrams的1/2,而不是1/4。但我不确定如何配置弹性搜索来给出这个结果
任何帮助都将不胜感激。您可以使用,但首先需要将您的标识符
字段映射为多字段
,如下所示
"identifier": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
您需要这样做,因为如果您直接在标识符上对进行排序
,那么您将得到相同的结果,因为由于边缘ngram过滤器
,它们都将具有两个字母标记。之后,这将给你想要的结果
{
"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
},
"sort": {
"_script": {
"script": "doc['identifier.raw'].value.length()",
"order": "asc",
"type": "number"
}
}
}
希望这有帮助 您使用的是什么版本的ES?解决方案有效吗?嘿,巴德,对不起,我还没有机会实现它并亲自尝试。它会在附加的bool
条件下工作还是会覆盖这些条件?没问题,巴德,我几乎可以肯定它会在不同的bool条件下工作,但如果你能发布完整的查询,我可以测试它,并确保100%的酷巴德,我会尽快查看它。伙计,再次感谢你的回答。当我只想查询这一个字段,但当合并其他查询时,它完全超越了相关性得分时,这种方法就起作用了。我不确定我是否能够按照我的需求进行脚本排序。我还想提及其他任何一个,在较新版本的ES(我使用的是ES 2.1)中默认禁用内联脚本。您可以启用此功能。或者将脚本创建为.groovy
文件,并将其放在您的/config/scripts/
目录中。