如何在 ElasticSearch 中组合多个查询

How To Combine Multiple Queries In ElasticSearch

我在尝试正确组合弹性搜索查询时遇到问题,在 SQL 中,我的查询看起来像这样:

Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')

我可以自己实现每一个并得到正确的结果。

查询 A)(PId = 10 和 PUId = 1130) 翻译成

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "PId": "1366"
          }
        },
        {
          "term": {
            "PUId": "10"
          }
        }
      ]
    }
  }
}

查询 B)(PId = 10 和 PUId = 1130) 翻译与上面相同,只是值不同

查询 C) (PlayerID = '12345') 翻译成

{
  "query": {
    "match": {
      "PlayerUuid": "62fe0832-7881-477c-88bb-9cbccdbfb3c3"
    }
  }
}

我一直在试图弄清楚如何将所有这些都放入同一个 ES 搜索查询中,但我一点运气都没有,希望具有更丰富 ES 经验的人能够给我一个手.

将所有查询包装到 bool 查询的 should 子句中,您将其放入另一个顶级 boolfilter 子句中查询。

伪代码(当我在单元格 phone 上打字时):

“bool”: {
  “filter”: {
    “bool”: {
      “should”: [
        {query1},
        {query2},
        {query3}
      ]
    }
  }
}

在仅由 should-子句组成的 bool- 查询中,将要求 should-子句中的至少一个查询必须匹配(minimum_should_match-会出现这种情况)

更新实际查询(补充说明):

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "should": [
            {"bool": {{"must": [ {"term": {"PId": "10"}},{"term": {"PUId": "1130"}} ]}}},
            {"bool": {{"must": [ {"term": {"PId": "30"}},{"term": {"PUId": "2000"}} ]}}},
            {"term": {"PlayerId": "12345"}}
          ]
        }
      }
    }
  }
}

上面的示例将您的实际 bool-查询包装在另一个顶级 bool-查询的 filer-子句中,以遵循最佳实践并保证更好性能:当你不关心分数时,尤其是当它总是关于精确匹配查询时,你应该把它们放在 filter 子句中。对于这些查询,Elasticsearch 不会 计算分数,因此甚至可以缓存该查询的结果以获得更好的性能。

您可以使用 Bool query 使用 should(逻辑或)和 must(逻辑与)子句。

下面是子句Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')

的ES查询表示
POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "PId": "10"
                }
              },
              {
                "term": {
                  "PUId": {
                    "value": "1130"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "PId": "30"
                }
              },
              {
                "term": {
                  "PUId": "2000"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "PlayerId": "12345"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

请注意,我假设字段 PId、PUId 和 PlayerId 都是 keyword 类型。