ElasticSearch查询排序

针对原有Elasticsearch查询方式无法满足排序需求的问题,本文介绍了一种优化方案。通过客户端连接方式,利用BoolQueryBuilder和SortBuilders进行精确的条件匹配与排序,有效提升了查询效率。

场景

使用elasticsearch进行查询时,需要在查询时进行排序,而不是查询后进行排序。原本项目中采用的查询方式不能满足,因此对代码进行了优化,原先方式为使用elasticsearch继承的实现,

public interface SensorHistoryDocumentDao extends
		ElasticsearchRepository<SensorHistoryDocumentEntity, Long> {
	@Query("{\"bool\" : {\"must\" : {\"field\" : {\"sensor_code\" : \"?0\"}}}}")
    Page<SensorHistoryDocumentEntity> findBySensorcode(String sensor_code,Pageable pageable);
}

查询调用sensorHistoryDocumentDao即可:

Iterable<SensorHistoryDocumentEntity> searchResult = sensorHistoryDocumentDao.search(queryBuilder);

方案

使用了客户端连接的方式
pom.xml依赖

	<dependency>
		<groupId>org.elasticsearch.client</groupId>
		<artifactId>transport</artifactId>
		<version>5.6.3</version>
	</dependency>

客户端连接,需要先配置参数elasticsearchIp,elasticsearchPort

	Client client = TransportClient
				.builder()
				.build()
				.addTransportAddress(
						new InetSocketTransportAddress(InetAddress.getByName(elasticsearchIp), elasticsearchPort));

获取构造器

	BoolQueryBuilder queryBuilder = QueryBuilders
		.boolQuery()
		.must(QueryBuilders.matchQuery("sensor_code", sensorHistoryDto.getSensor_code()))
		.must(QueryBuilders.rangeQuery("createtime")
		.gt(stratTime).lt(endTime)
		.includeLower(true).includeUpper(true));// 时间为long类型

执行查询

		SearchResponse response = client.prepareSearch().setSize(100).setQuery(queryBuilder)
				.addSort(SortBuilders.fieldSort("createtime").order(SortOrder.DESC)).execute().actionGet();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值