gpt4 book ai didi

search - Elastic Search中的自动完成匹配

转载 作者:行者123 更新时间:2023-12-03 01:03:08 25 4
gpt4 key购买 nike

所以我在 flex 搜索中有一个identifier字符串字段,其中包含D123M1T23等值。

我试图在此字段的搜索中构建自动完成功能,以便对D12的查询可能与D12D120D121,...,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"
}

这意味着为 D1234索引的ngram为 D1D12D123D1234

要查询这个我做如下:

"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
}

这将从最长到最短返回结果,因此 D12出现在结果的末尾。如何确保尽可能短的标识符具有最高的相关性评分?

我的猜测是 D12查询正像这样匹配ngram: [{D12}, {D12}3, {D12}34]和 flex 搜索结果为“哦,太棒了,三个匹配项!”而不是 [{D12}]结果提供的1 D12

我猜一个解决方案可能不会部分匹配这些ngram,以便 flex 搜索看到两个结果的 [{D12}],但将 D12的排名高于 D1234,因为它匹配了ngram的1/2而不是1/4。我不确定如何配置 flex 搜索以给出此结果。

任何帮助将非常感激。

最佳答案

您可以使用script based sorting进行此操作,但首先需要像这样将identifier字段映射为multi-fields

"identifier": {
"type": "string",
"analyzer": "autocomplete",
"search_analyzer": "standard",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}

之所以需要这样做,是因为如果直接在 sort上使用 identifier,那么您将获得相同的结果,因为由于 edge ngram filter,所有这些都将具有 2个字母标记。之后,这将给您想要的结果
{
"query": {
"bool": {
"should": {
"match": {
"identifier": {
"query": "D12",
"fuzziness": 0
}
}
}
}
},
"sort": {
"_script": {
"script": "doc['identifier.raw'].value.length()",
"order": "asc",
"type": "number"
}
}
}

希望这可以帮助!!

关于search - Elastic Search中的自动完成匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34605755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com