Elasticsearch之bool查询

bool 查询是 Elasticsearch 中最常用的复合查询类型,允许将多个查询组合在一起。它通过逻辑操作符(如 mustshouldmust_notfilter)来构建复杂的查询条件,从而满足多条件匹配、逻辑与(AND)、或(OR)、非(NOT)的查询需求。

bool 查询主要由四个部分组成:

  • must:必须满足的条件(类似于 SQL 中的 AND)。
  • should:应该匹配的条件(类似于 SQL 中的 OR)。should 子句中的查询可以匹配也可以不匹配,但如果匹配,它会提高文档的相关性得分。
  • must_not:必须不匹配的条件(类似于 SQL 中的 NOT)。
  • filter:过滤条件,不影响文档的得分,只做精确的过滤判断。它对性能的影响较小,适合对大批量数据进行过滤。

1. 示例

GET /items/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"name": "手机"}}
      ],
      "should": [
        {"term": {"brand": { "value": "vivo" }}},
        {"term": {"brand": { "value": "小米" }}}
      ],
      "must_not": [
        {"range": {"price": {"gte": 2500}}}
      ],
      "filter": [
        {"range": {"price": {"lte": 1000}}}
      ]
    }
  }
}

2. 解释

must(必须匹配)

  • 这里使用了一个 match 查询,要求文档中的 name 字段必须包含 "手机"。也就是说,只有 name 包含“手机”的文档才会被返回。

should(可选匹配)

  • 这里有两个 term 查询,分别要求 brand 字段为 "vivo""小米"。如果文档满足其中之一,将增加其相关性得分,但即使不匹配这些条件,文档也可能被返回(前提是 must 部分满足)。

must_not(必须不匹配)

  • 这里的 range 查询指定 price 字段的值必须小于 2500。也就是说,价格大于或等于 2500 的文档将被排除在外。

filter(过滤)

  • 使用 range 查询来筛选 price 小于或等于 1000 的文档。不同于 mustshouldfilter 不会影响文档的得分,只是对结果集进行精确的过滤,性能较好。

3. 使用

在idea中可以通过SearchRequest来构造查询条件。

// 构造查询条件
SearchRequest.Builder builder = new SearchRequest.Builder();

builder.query(query -> query.bool(bool -> {
    // 必须匹配name为"手机"
    bool.must(must ->
        must.match(match ->
            match.field("name").query("手机")));

    // 添加 should 条件,匹配品牌(比如vivo或小米)
    bool.should(should -> 
        should.term(term ->
            term.field("brand").value("vivo")));
    bool.should(should ->
        should.term(term ->
            term.field("brand").value("小米")));

    // 排除价格大于或等于2500的记录
    bool.mustNot(mustNot -> 
        mustNot.range(range ->
            range.field("price").gte(2500)));

    // 过滤价格小于或等于1000的记录
    bool.filter(filter ->
        filter.range(range ->
            range.field("price").lte(1000)));
    
    return bool;
}));

你可能感兴趣的:(java,elasticsearch,大数据,搜索引擎,bool,布尔,查询,全文检索)