首页 > 解决方案 > 如何结合“AND”和“OR”查询以获得两者的结果?

问题描述

我正在尝试使用一个查询来获取两个查询的结果。

我必须为每个多字字符串查询请求运行两个查询,然后以编程方式将结果组合到我觉得不合适的代码中。

其中一个查询使用AND运算符,其中一个使用OR运算符。

这是第一个查询:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"exists": {"field": "deleted"}}
      ],
      "must": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "AND"
          }
        }
      ],
      "filter": [
        {"term": {"kind": "article"}},
        {"term": {"status": "published"}}
      ]
    }
  }
}

这是第二个查询:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"exists": {"field": "deleted"}}
      ],
      "must": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "OR"
          }
        }
      ],
      "filter": [
        {"term": {"kind": "article"}},
        {"term": {"status": "published"}}
      ]
    }
  }
}

想法是在顶部AND获取第一个查询(使用运算符的查询)的结果,然后在第一个结果下方获取第二个查询(使用运算符的查询)的结果。OR

有没有办法用一个查询而不是两个来实现这一点

标签: elasticsearch

解决方案


您可能可以利用bool/should更高的boost因素进行 AND 匹配:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "deleted"
          }
        }
      ],
      "minimum_should_match": 1,
      "should": [
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "AND",
            "boost": 2,                   <--- boost AND by 2 (or more)
            "_name": "and-match"
          }
        },
        {
          "multi_match": {
            "query": "refuse eating",
            "fields": [
              "title^3",
              "desc^2",
              "body"
            ],
            "type": "best_fields",
            "operator": "OR",
            "_name": "or-match"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "kind": "article"
          }
        },
        {
          "term": {
            "status": "published"
          }
        }
      ]
    }
  }
}

推荐阅读