elasticsearch

elasticsearch和springbooot整合注意

2022-03-02  本文已影响0人  virtual灬zzZ

基于elasticsearch7.17+springbooot2.3.3

在查询时,假设DSL语法如下:

#####组合bool查询,bool嵌套bool
GET /building/_doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {"match": {"name": "广东"}},
              {"range": {"history_years": {"gt": 4}}}
              ]
            ,
            "must_not": {
              "range": {"create_time": {"lte": "2007-01-01"}}
            }
          }
        }
        ,
        {
          "term": {"shortname": "滕王阁"}
        }
      ]
    }
  }
}

错误写法

public SearchResponse<Building> queryComposite(String idx, Building building) throws IOException {
        SearchRequest.Builder builder = new SearchRequest.Builder();
        builder.index(idx);
        builder.query(Query.of(qb -> {
            return qb.bool(BoolQuery.of(bb ->
                    bb.should(
                            Query.of(q -> {
                                q.term(TermQuery.of(t -> t.field("shortname").value(FieldValue.of(building.getShortname()))));
                                q.bool(v -> {
                                    v.must(Query.of(mq -> {
                                        mq.match(MatchQuery.of(m -> m.field("name").query(FieldValue.of(building.getName()))));
                                        mq.range(r -> r.field("history_years").gt(JsonData.of(building.getHistoryYears())));
                                        return mq;
                                    }));
                                    v.mustNot(mn -> mn.range(r -> r.field("create_time").lte(JsonData.of(building.getCreate_time()))));
                                    return v;
                                });
                                return q;
                            })
                    )
            ));
        }));
        return esClient.search(builder.build(), Building.class);
    }

正确写法

public SearchResponse<Building> queryComposite(String idx, Building building) throws IOException {
        SearchRequest.Builder builder = new SearchRequest.Builder();
        builder.index(idx);
        builder.query(Query.of(qb -> qb.bool(BoolQuery.of(bb -> {
            bb.should(Query.of(q -> q.term(TermQuery.of(t -> t.field("shortname").value(FieldValue.of(building.getShortname()))))));
            bb.should(Query.of(q -> q.bool(v -> {
                v.must(Query.of(mq -> mq.match(MatchQuery.of(m -> m.field("name").query(FieldValue.of(building.getName()))))));
                v.must(Query.of(mq -> mq.range(r -> r.field("history_years").gt(JsonData.of(building.getHistoryYears())))));
                v.mustNot(mn -> mn.range(r -> r.field("create_time").lte(JsonData.of(building.getCreate_time()))));
                return v;
            })));
            return bb;
        }))));
        return esClient.search(builder.build(), Building.class);
    }

第二个bool和term是同级的,同理must下的两个都是同级的,要理解它们都是should数组下的元素,所以它们都得各自should,同理must也是如此。query绝对不能多用,只能和条件一对一,不然覆盖

参考:
es进行检索
ES 7.16 Java API Client 新特性

上一篇 下一篇

猜你喜欢

热点阅读