我使用 span_near 和 模糊查询 按短语搜索文本。即使单词顺序错误,如果我输入准确的短语,效果也很好。但我想找到不完全相同的短语,而是非常相似的东西。
例如:
我有这样的文字:
我起得很早,因为他的狗大声吠叫
还有这些搜索案例,当我的文档必须被发现时:
我起得很早
(准确的短语)
我因为狗叫而醒来
(短语中间漏掉了一些小词)
我总是早起,因为狗叫
(中间多加了一些字)
但在这些情况下不应找到文档:
我醒来并吠叫
(短语中缺少太多单词)
我经常在凌晨 2 点醒来,当月亮好的时候,狼会在我的窗下吠叫。
(短语中附加词过多)
如果有人帮助我,我将不胜感激!这是我使用的代码(单词用空格分隔,每个单词都添加到一个 span_multi 对象中):
{
"query": {
"bool": {
"must": [
{
"span_near": {
"clauses": [
{
"span_multi": {
"match": {
"fuzzy": {
"text": {
"value": "I",
"fuzziness": 2
}
}
}
}
},
{
"span_multi": {
"match": {
"fuzzy": {
"text": {
"value": "wake",
"fuzziness": 2
}
}
}
}
},
{
"span_multi": {
"match": {
"fuzzy": {
"text": {
"value": "up",
"fuzziness": 2
}
}
}
}
} }
}
],
"slop": 5,
"in_order": false
}
}
]
}
},
"size": 20,
"from": 0,
"sort": [
{
"petition_number": {
"unmapped_type": "keyword",
"order": "asc"
}
}
]
}
您的查询示例效果很好,除了“短语中间缺少一些小单词”用例。不幸的是,
minimum_should_match
查询中没有 span_near
参数,因此您可能需要生成查询的所有可能版本。基本上,如果您正在搜索 I always wake up early
并且可以忽略一个单词,您将生成短语查询。
always wake up early
I wake up early
I always up early
I always wake early
I always wake up
我知道这不是您正在寻找的解决方案,但我认为这是库存 Elasticsearch 可能的最佳解决方案,除非您愿意改变您的要求。