我们使用弹性搜索来搜索地址数据,并且出于非精确匹配的目的,我们包括了街道名称的字段变体,并使用ngram标记器(具体来说是字母)进行了分析。并且我们对该字段的查询使用了“最低应匹配”子句“ 3 <75%”,这意味着“如果搜索字词中有3个或更少的三字母组,那么它们都必须匹配。如果超过3个,则其中75%必须匹配'
通常这可以,但是在某些情况下,我们会得到这样的意外结果
我们搜索“ Uhland”,然后找到“ Am Maschlandgraben”。据我所知,将“ Uhland”分为“ uhl”,“ hla”,“ lan”,“ and”,这4个字母中的3个可以与“ Am MascHLANDgraben”(匹配部分(大写)。因此,四分之三表示满足我们的“ 3 <75%”要求的75%,因此成为匹配项。
因此有75%的匹配具有“方向性”(因为缺少更好的词)。它只会查看/计算搜索词中的词数,而忽略索引文档中有多少个三字母组合不匹配。
一个人可能会争辩说在该示例中未满足75%的匹配要求,因为来自“ Am Maschlandgraben”的13个卦中有10个没有与“ Uhland”的卦相匹配。实际上,如果您反向查询并搜索“ Am Maschlandgraben”,则不会找到“ Uhland”作为匹配项。因为现在“方向性”被反转,查询意识到13个三元组中只有3个匹配,因此不满足“ 3 <75%”的要求
我想弄清楚的是如何修改查询,以便75%的匹配没有“方向性”,并且始终必须在比较的“双方”都匹配。因此,保持上面的示例不变,我既不想让“ Uhland”与“ Am Maschlandgraben”匹配,也不想“ Am Maschlandgraben”与“ Uhland”匹配
因此,我想用现实生活的语言来表达,而不是“ 75%的搜索词三元组需要匹配索引文档”,我希望“ 75%的搜索词和索引三元组都需要匹配”
我希望我能很好地传达我的意图(英语不是我的母语)
以下是我们的查询现在的外观示例_
{
"query": {
"bool": {
"should": [
{
"match": {
"address.street.trigram": {
"query": "Uhland",
"minimum_should_match": "3<75%"
}
}
}
]
}
}
}