java-es 搜索条件拼接 SearchSourceBuilder

该文详细描述了如何使用Elasticsearch进行数据去重、排序以及设置搜索分页的过程。通过CollapseBuilder进行去重,使用SortBuilders.fieldSort进行字段排序,调整搜索结果的起始位置和每页大小以实现分页。同时,文章展示了复杂的布尔查询语法,用于构建灵活的搜索条件,包括设置查询条件的权重和忽略大小写匹配。

1,根据字段数据去重

CollapseBuilder collapseBuilder = new CollapseBuilder("?");
sourceBuilder.collapse(collapseBuilder);

2,排序

super.sourceBuilder.sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));

3,设置搜索分页

sourceBuilder.from((searchDto.getPageIndex() - 1) * searchDto.getPageSize()).size(searchDto.getPageSize());

4,搜索条件拼接

.boost() 设置条件等级    .caseInsensitive(true)忽略查询大小写
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder()
                .must(QueryBuilders.boolQuery()
                        .must(QueryBuilders.boolQuery()
                                .should(QueryBuilders.wildcardQuery("title.keyword", searchDto.getKeyword()).boost(5).caseInsensitive(true))
                                .should(QueryBuilders.wildcardQuery("title.keyword", key).caseInsensitive(true)))
                        .must(QueryBuilders.boolQuery()
                                .should(QueryBuilders.boolQuery()
                                        .must(QueryBuilders.termQuery("historyIsDelete", false))
                                        .must(QueryBuilders.termQuery("typeId", "1"))
                                        .must(QueryBuilders.termQuery("playBackRecording", 1))
                                        .must(QueryBuilders.rangeQuery("saveRecordingTime").gte(time))
                                        .must(QueryBuilders.termQuery("transcodingStatus", 1)))
                                .should(QueryBuilders.boolQuery()
                                        .must(QueryBuilders.termQuery("channelIsDelete", false))
                                        // .must((QueryBuilders.rangeQuery("beginTime").gte(date)))
                                        .must((QueryBuilders.boolQuery().should((QueryBuilders.rangeQuery("liveBeginTime").gte(date)))
                                                .should(QueryBuilders.termQuery("isReserve", 1))))))
                );

sourceBuilder.query(boolQueryBuilder);

效果如下

{"from":0,"size":4,"query":{"bool":{"must":[{"bool":{"must":[{"bool":{"should":[{"wildcard":{"title.keyword":{"wildcard":"2023","case_insensitive":true,"boost":5.0}}},{"wildcard":{"title.keyword":{"wildcard":"*2023*","case_insensitive":true,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},{"bool":{"should":[{"bool":{"must":[{"term":{"historyIsDelete":{"value":false,"boost":1.0}}},{"term":{"typeId":{"value":"1","boost":1.0}}},{"term":{"playBackRecording":{"value":1,"boost":1.0}}},{"range":{"saveRecordingTime":{"from":1676451404,"to":null,"include_lower":true,"include_upper":true,"boost":1.0}}},{"term":{"transcodingStatus":{"value":1,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},{"bool":{"must":[{"term":{"channelIsDelete":{"value":false,"boost":1.0}}},{"bool":{"should":[{"range":{"liveBeginTime":{"from":"2023-02-15T08:56:44.723Z","to":null,"include_lower":true,"include_upper":true,"boost":1.0}}},{"term":{"isReserve":{"value":1,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"sort":[{"createTime":{"order":"desc"}}]}
### Elasticsearch 查询条件为空时的拼接方法 在 Elasticsearch 中,当查询条件为空时,可以通过 `bool` 查询中的 `should` 子句结合 `exists` 查询来实现。如果需要查询某个字段为空或满足其他条件的情况,可以使用 `must_not` 和 `exists` 的组合[^4]。 以下是实现空值查询的具体方法和代码示例: #### 1. 查询字段为空 通过 `must_not` 和 `exists` 查询的组合,可以实现对字段为空的查询。例如,查询 `math_score` 字段为空的数据: ```json { "query": { "bool": { "must_not": [ { "exists": { "field": "math_score" } } ] } } } ``` 此查询表示查找所有 `math_score` 字段不存在(即为空)的文档[^4]。 #### 2. 查询字段为空或满足其他条件 如果需要查询字段为空或满足其他条件的情况,可以将 `should` 子句与多个条件组合。例如,查询 `math_score` 字段为空或小于 60 的数据: ```json { "query": { "bool": { "should": [ { "bool": { "must_not": [ { "exists": { "field": "math_score" } } ] } }, { "range": { "math_score": { "lt": 60 } } } ], "minimum_should_match": 1 } } } ``` 在此查询中: - 第一个 `should` 条件表示 `math_score` 字段为空。 - 第二个 `should` 条件表示 `math_score` 小于 60。 - `minimum_should_match: 1` 表示只需满足其中一个条件即可[^3]。 #### 3. Java 实现 ES 查询条件拼接Java 中,可以通过 Elasticsearch 提供的客户端库(如 RestHighLevelClient)来动态拼接查询条件。以下是一个示例代码,展示如何拼接查询条件为空的查询: ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; public class ElasticsearchQueryExample { public static void main(String[] args) throws Exception { RestHighLevelClient client = new RestHighLevelClient(); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("math_score"))); boolQuery.should(QueryBuilders.rangeQuery("math_score").lt(60)); boolQuery.minimumShouldMatch(1); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(boolQuery); SearchRequest searchRequest = new SearchRequest("your_index_name"); searchRequest.source(sourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println(response.toString()); } } ``` 此代码实现了动态拼接查询条件,并支持字段为空或满足其他条件的查询[^2]。 ### 注意事项 - 在实际应用中,需要根据具体需求调整查询条件- 如果字段类型为文本类型,可能需要先进行分词处理后再查询。 - Elasticsearch 的查询性能与索引设计密切相关,建议优化字段映射以提高查询效率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值