ElasticSearch 按短语查找文档(带/不带额外单词)

问题描述 投票:0回答:1

我使用 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"
            }
        }
    ]
}
elasticsearch full-text-search elasticsearch-dsl
1个回答
0
投票

您的查询示例效果很好,除了“短语中间缺少一些小单词”用例。不幸的是,

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 可能的最佳解决方案,除非您愿意改变您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.