【问题标题】:Elasticsearch: how to write bool query that will contain multiple conditions on the same token?Elasticsearch:如何编写在同一令牌上包含多个条件的布尔查询?
【发布时间】:2021-05-20 02:10:27
【问题描述】:

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

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

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

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

  • bmail // MATCH:因为它匹配模糊搜索而不是 gamil
  • gamil.bmail // MATCH:因为术语 bmail 匹配模糊搜索而不是 gamil
  • gamil // 不匹配:因为它匹配模糊搜索,但等于 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"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  },
}

【问题讨论】:

  • 您在这里尝试过答案吗? stackoverflow.com/questions/28614805/…
  • @D.C 你能分享一些示例索引数据和预期的搜索结果吗?
  • @D.C 您可以使用令牌过滤器删除不应匹配的术语吗? elastic.co/guide/en/elasticsearch/reference/current/…
  • @RonSerruya 如果我理解正确,建议将两个字段加入nested 一个,在我的情况下,我只有一个字段被标记为多个令牌
  • @ESCoder 你能说得更具体点吗?我不确定还缺少什么,我发布了一个查询示例并在问题中提供了预期结果

标签: elasticsearch


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2022-01-17
    • 2014-11-09
    • 2010-11-11
    • 2020-10-17
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多