首页 > 解决方案 > Elasticsearch:如何编写在同一令牌上包含多个条件的布尔查询?

问题描述

我有一个带有分词器的字段,它按点拆分。在搜索时,以下值 aaa.bbb将被拆分为两个术语aaabbb

我的问题是如何编写在同一术语上包含多个条件的布尔查询?

例如,我想获取其字段包含与模糊搜索匹配的术语gmail但同一术语不得包含的所有文档gamil

以下是我想要实现的一些示例:



注意:以下查询似乎不起作用,因为它看起来好像一个术语匹配一个条件而第二个术语匹配另一个,它将被视为命中。

{
  ...
  "body": {
    "query": {
      "bool": {
        "must": [
          {
            "fuzzy": {
              "my_field": {
                "value": "gmail",
                "fuzziness": 1,
                "max_expansions": 2100000000
              }
            }
          },
          {
            "bool": {
              "must_not": [
                {
                  "query_string": {
                    "default_field": "my_field",
                    "query": "*gamil*",
                    "analyzer": "keyword"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  },
}

标签: elasticsearch

解决方案


我最终通过执行模糊(或任何其他)查询来使用Highlight,然后通过返回的高亮对象以编程方式过滤结果。

如果您不需要正则表达式或者您可以确保不超过布尔查询限制,跨度查询也可能是一个不错的选择。(在提供的链接中查看更多详细信息)


推荐阅读