如何在ElasticSearch中组合多个查询

时间:2020-03-01 23:26:01

标签: elasticsearch elasticsearch-query

我在尝试正确组合弹性搜索查询时遇到问题,在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经验的人能帮上忙。

2 个答案:

答案 0 :(得分:0)

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

伪代码(当我在手机上键入时):

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

在仅由bool条组成的should-查询中,将要求should条中至少一个查询必须匹配({ {1}}-在这种情况下。

使用实际查询进行更新(其他说明):

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查询的filer子句中,以遵循最佳实践并保证更好的性能:每当您不关心分数时,尤其是当它始终与精确匹配查询有关时,都应将其放入bool子句中。对于这些查询,Elasticsearch将计算分数,因此甚至可以潜在地缓存该查询的结果,从而获得更好的性能。

答案 1 :(得分:0)

您可以使用should(逻辑OR)和must(逻辑AND)子句来使用Bool query

下面是子句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类型。