Elasticsearch分页查询、排序、多条件查询(java API)

最近公司项目用到Elasticsearch,自己摸索了好几天才把这个弄明白,和大家分享一下:

一、建立Elasticsearch连接

package com.wlsj.yshj.config;


import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.ArrayList;

/**
 * Description: dp
 */
@Configuration
public class EsConfiguration {

    private static String hosts = "172.63.24.50"; // 集群地址,多个用,隔开
    private static int port = 9100; // 使用的端口号
    private static String schema = "http"; // 使用的协议
    private static ArrayList<HttpHost> hostList = null;

    private static int connectTimeOut = 1000; // 连接超时时间
    private static int socketTimeOut = 30000; // 连接超时时间
    private static int connectionRequestTimeOut = 500; // 获取连接的超时时间

    private static int maxConnectNum = 100; // 最大连接数
    private static int maxConnectPerRoute = 100; // 最大路由连接数

    static {
        hostList = new ArrayList<>();
        String[] hostStrs = hosts.split(",");
        for (String host : hostStrs) {
            hostList.add(new HttpHost(host, port, schema));
        }
    }

    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }

    @Bean
    public RestHighLevelClient client() {
        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
        // 异步httpclient连接延时配置
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public Builder customizeRequestConfig(Builder requestConfigBuilder) {
                requestConfigBuilder.setConnectTimeout(connectTimeOut);
                requestConfigBuilder.setSocketTimeout(socketTimeOut);
                requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
                return requestConfigBuilder;
            }
        });
        // 异步httpclient连接数配置
        builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                httpClientBuilder.setMaxConnTotal(maxConnectNum);
                httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
                return httpClientBuilder;
            }
        });
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }

}

二、开始写查询和封装条件

1、分页参数

2、创建一个 SearchSourceBuilder、BoolQueryBuilder、QueryBuilder

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
QueryBuilder queryBuilder = bq.must(QueryBuilders.existsQuery("公司名称"));

是否存在

在一个范围之内

min:最小数

max:最大数

gt :  大于  gte: 大于等于   lt: 小于  ,lte:小于等于

匹配用matchQuery()

不包含mustNot()

注意:在比较的时候 ES中的数据类型要匹配(date,float、int)切记、切记

2、查询数量

3、排序

4、连接es查询列表

5、处理查询结果

至此分页查询完结。需要注意的如下:

(1)、对matchQuery()、termQuery()、existsQuery()等的查询方法应用,要自己揣摩一下;

(2)、查询开始时 SearchSourceBuilder、BoolQueryBuilder、QueryBuilder这些对象的创建和顺序;

(3)、对查询结果的封装,这个相对java同学比较简单。

 

二、单条数据的查询:

 

 

  • 13
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值