所以我有一个的identifier
弹性搜索包含类似值串场D123
,M1
,T23
等。
我试图建立自动完成进入搜索这一领域,使得查询D12
可能匹配D12
,D120
,D121
,...,D1210
等等。
目前,我已经构建了一个自定义的边缘ngram过滤器和分析器,如下所示:
"filter": {
"autocomplete_filter": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 10
}
}
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "whitespace",
"filter": {"lowercase", "autocomplete_filter"}
}
}
在索引中,我identifier
在索引时在字段上使用它:
"identifier": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
这意味着,被索引为n元语法D1234
是D1
,D12
,D123
和D1234
。
要查询这个我做如下:
"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
}
该结果从最长到最短返回,因此D12
出现在结果的结尾。如何确保尽可能短的标识符具有最高的相关性评分?
我的猜测是D12
查询像这样匹配ngram:[{D12}, {D12}3, {D12}34]
弹性搜索变为“哦,太好了,三个匹配项!” 而不是1[{D12}]
的D12
结果会给。
我猜一个解决方案可能不是部分匹配这些ngram,因此弹性搜索可以看到[{D12}]
两个结果,但是排名D12
更高,D1234
因为它匹配了ngram的1/2,而不是1/4。我不确定如何配置弹性搜索以给出此结果。
任何帮助将非常感激。
您可以使用基于脚本的排序来完成此操作,但首先需要像这样映射identifier
字段multi-fields
"identifier": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
你需要这样做,因为如果你sort
直接上identifier
,那么你会得到相同的结果,因为他们都将是具有2个字母标记因edge ngram filter
。之后,这将给您想要的结果
{
"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
},
"sort": {
"_script": {
"script": "doc['identifier.raw'].value.length()",
"order": "asc",
"type": "number"
}
}
}
希望这可以帮助!!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句