Elasticsearch使用要点(四)-多条件查询

组合多条件查询

组合多条件查询是生产过程中使用场景较多的查询, 故在此单独作为一篇来记录.

bool查询:

注意: query查询terms条件元素数量有1024大小的限制, 超过会报错:org.elasticsearch.common.io.stream.NotSerializableExceptionWrapper: too_many_clauses: maxClauseCount is set to 1024.

解决办法: 使用filter查询或者改es配置文件. 参考 & 文档

bool查询能够将多个查询条件组合在一起, 每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。

参数 含义
must 文档 必须 匹配这些条件才能被包含进来。(计算相关度)
must_not 文档 必须不 匹配这些条件才能被包含进来。(计算相关度)
should 如果满足这些语句中的任意语句(or),将增加 _score ,否则,无任何影响。(计算相关度)
filter 必须 匹配,但它以不评分、过滤模式来进行。(不计算相关度)
  • filter参数中的查询均不会计算相关度, 不会影响文档的相关度排名. 而且当一个查询不计算相关度时, 可以被es缓存在内存中, 提高性能.
  • 将查询移到 bool 查询的 filter 语句中, 这样它就自动的转成一个不评分的 filter .
  • bool 查询包裹在 filter 语句中. 我们可以在过滤标准中增加布尔逻辑. 适用于复杂的过滤逻辑.通过混合布尔查询, 我们可以在我们的查询请求中灵活地编写 scoringfiltering 查询逻辑.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {
    "bool": {
    "filter": {
    "bool": {
    "must": [
    { "range": { "date": { "gte": "2014-01-01" }}},
    { "range": { "price": { "lte": 29.99 }}}
    ],
    "must_not": [
    { "term": { "category": "ebooks" }}
    ]
    }
    }
    }
    }

constant_score查询:

可以使用它来取代只有 filter 语句的 bool 查询. 在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

  • constant_score查询将一个不变的常量评分应用于所有匹配的文档. 它被经常用于你只需要执行一个 filter 的情况下.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    GET students/_search
    {
    "query": {
    "constant_score": {
    "filter": {
    "term": {
    "name.keyword": "12"
    }
    },
    "boost": 1.2 // 代表常量评分
    }
    }
    }

explain查询:

  • 通过explain参数, 可以让返回结果中假如数据所在的分片 or 节点信息. 或者解释某一文档为何(不)被返回. 这个查询的代价很昂贵, 仅在开发调试时使用.