【问题标题】:How to write ElasticSearch query with AND condition如何使用 AND 条件编写 ElasticSearch 查询
【发布时间】:2020-10-17 08:01:24
【问题描述】:

我正在尝试编写一个弹性搜索查询来搜索具有以下两个条件的数据

{
  "query": {
    "match": {
      "trackingId": "track4324234234244",
      "log_message": "downstream request-response"
    }
  }
}

上述查询不起作用,因为 [match] 查询不支持多个字段。有什么办法可以做到这一点。

【问题讨论】:

  • 好久不见,有没有机会看一下我的回答,期待得到您的反馈,如果有帮助,请不要忘记点赞并采纳:)跨度>

标签: elasticsearch


【解决方案1】:

您可以使用Bool query,其中可以使用must 子句。

must 表示:子句(查询)必须出现在匹配的文档中。这些子句必须匹配,例如逻辑 AND。

要了解must和should的区别可以参考这个SO answer

添加带有示例文档和搜索查询的工作示例

索引样本数据:

{
    "trackingId":"track4324234234244",
    "log_message":"downstream request-response"
}
{
    "trackingId":"track4324234234244",
    "log_message":"downstream"
}
{
    "trackingId":"tracks4324234234244",
    "log_message":"downstream request-response"
}

搜索查询:

    {
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "trackingId": "track4324234234244"
          }
        },
        {
          "match": {
            "log_message": {
              "query": "downstream request-response",
              "operator": "and"
            }
          }
        }
      ]
    }
  }
}

搜索结果:

"hits": [
        {
            "_index": "my_index",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.8570712,
            "_source": {
                "trackingId": "track4324234234244",
                "log_message": "downstream request-response"
            }
        }
    ]

【讨论】:

    【解决方案2】:

    除了Bool,您还可以使用simple query string,如下所述:

    POST <your_index_name>/_search
    {
      "query": {
        "simple_query_string": {
          "fields": ["trackingId", "log_message"],
          "query": "track4324234234244 downstream request-response",
          "default_operator": "AND"
        }
      }
    }
    

    请注意我刚刚添加了所有条款并使用了default_operator: AND,以便它只返回包含所有条款的文档。

    还有query_string,但是我建议使用上面的query_string 严格意义上的工作方式,如果查询字符串有任何语法错误而simple_query_string 没有,它会抛出错误。

    POST <your_index_name>/_search
    {
      "query": {
        "query_string": {
          "fields": ["trackingId", "log_message"],
          "query": "(track4324234234244) AND (downstream request-response)",
          "default_operator": "AND"
        }
      }
    }
    

    至于何时使用simple_query_string,主要是仅当您希望向最终用户公开查询字符串或术语时,这将是有用的。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多