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绝对不能多用,只能和条件一对一,不然覆盖。