【Java查询Elasticsearch】Java使用BoolQueryBuilder查询Elasticsearch

需求

使用Java查询es数据,查询时传入相关条件
需要查询的ES及查询结构

方案

使用 org.elasticsearch.action.search.SearchRequest 查询

代码

	// com.alibaba.fastjson.JSONObject
	// JSONObject param = new JSONObject();
	// 入参格式: systemId "sys_a,sys_b,sys_c"
	String systemIds= param.getString("systemIds");
	// 查询请求
    SearchRequest searchRequest = new SearchRequest();
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 查询结构构造
    BoolQueryBuilder shouldBuilder = new BoolQueryBuilder();

	// 系统ID
    if (StringUtils.isNotEmpty(systemIds)) {
        String[] strings = systemIds.split(",");
        for (String id : strings) {
            
		   // 因为ES查询结构中有'keyword' 字段,所以查询时也加上
           shouldBuilder.should(QueryBuilders.termQuery("systemId.keyword", id));
        }
    }
    // 开始结束时间范围
    if (StringUtils.isNotEmpty(param.getString("startTime"))&&StringUtils.isNotEmpty(param.getString("endTime"))) {
        shouldBuilder.should(QueryBuilders.rangeQuery("createdTime")
                .gte(param.getDate("startTime").getTime())
                .lte(param.getDate("endTime").getTime()));
    }
    // 查询
    sourceBuilder.query(shouldBuilder);
    // 分页
    sourceBuilder.from((param.getInteger("pageNum") - 1) * param.getInteger("pageSize"));
    // 每页数量
    sourceBuilder.size(Integer.parseInt(param.get("pageSize").toString()));
    // 排序
    sourceBuilder.sort("createdTime", SortOrder.DESC);
    // 请求构建
    searchRequest.source(sourceBuilder);
	try {
		// 执行查询
		SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		// 命中结果
		org.elasticsearch.search.SearchHits hits = searchResponse.getHits();
		for (org.elasticsearch.search.SearchHit hit : hits) {
			// 自定义遍历操作
		}

	} catch (IOException e) {
	    throw new RuntimeException(e);
	}

查询 sourceBuilder 结构如下
查询 sourceBuilder 结构

注意事项

should查询类似OR查询,会将多个should条件进行OR查询,查询会出现不在should条件内的结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 SearchSourceBuilderBoolQueryBuilder 实现多条件查询 ElasticsearchJava 代码示例: ```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.common.unit.TimeValue; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; import java.util.concurrent.TimeUnit; public class ElasticsearchMultiQuery { public void multiQuery(RestHighLevelClient client) throws IOException { SearchRequest searchRequest = new SearchRequest("my_index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 创建 BoolQueryBuilder BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 添加 TermQueryBuilder TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("field1", "value1"); boolQueryBuilder.must(termQueryBuilder); // 添加 RangeQueryBuilder RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("field2"); rangeQueryBuilder.gte("2021-01-01T00:00:00.000Z"); rangeQueryBuilder.lte("2021-01-31T23:59:59.999Z"); boolQueryBuilder.must(rangeQueryBuilder); // 将 BoolQueryBuilder 添加到 SearchSourceBuilder sourceBuilder.query(boolQueryBuilder); // 设置超时时间 sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); searchRequest.source(sourceBuilder); // 执行查询 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 处理查询结果 SearchHits hits = searchResponse.getHits(); SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { String sourceAsString = hit.getSourceAsString(); System.out.println(sourceAsString); } } } ``` 这个示例中,我们创建了一个 SearchRequest 对象,用于指定要查询的索引名称。然后,我们创建了一个 SearchSourceBuilder 对象,并使用 BoolQueryBuilder 来添加多个查询条件,包括 TermQueryBuilder 和 RangeQueryBuilder。最后,我们将 BoolQueryBuilder 添加到 SearchSourceBuilder 中,并设置了查询超时时间。最后,我们执行查询并处理查询结果。 注意:示例中的代码并没有完整的异常处理和连接 Elasticsearch 的代码,需要根据实际情况进行补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值