Java 客户端操作ElasticSearch(包含增删改查及基础语法操作)

目录

1.Java 工程引入Maven依赖

2.设置创建客户端对象

3.常用查询API

1.查询所有代码示例

 2.一般查询代码示例

3.或查询代码示例

4.模糊查询代码示例

5.多值查询代码示例

6.存在查询

7.范围查询

8.正则查询

总结

参考


1.Java 工程引入Maven依赖

maven依赖如下(版本自行设置,如本文使用7.4.0版本)

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.0</version>
        </dependency>

2.设置创建客户端对象

@Slf4j
@Configuration
public class ElasticSearchConfig {

    @Resource
    private ElasticSearch58Property elasticSearch58Property;

    @Resource
    private ElasticSearchAliProperty elasticSearchAliProperty;

    private static final int CONNECT_TIMEOUT = 5 * 1000;

    private static final int SOCKET_TIMEOUT = 30 * 1000;

    private static final int CONNECTION_REQUEST_TIMEOUT = 30 * 1000;

    @Bean(name = "restHighLevelClient58")
    public RestHighLevelClient getRestHighLevelClient58() {
        RestClientBuilder restClientBuilder = restClientBuilder(elasticSearch58Property);
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
        log.info("[RestClient]58 RestHighLevelClient inited!");
        return restHighLevelClient;
    }

    @Bean(name = "restHighLevelClientAli")
    public RestHighLevelClient getRestHighLevelClientAli() {
        RestClientBuilder restClientBuilder = restClientBuilder(elasticSearchAliProperty);
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
        log.info("[RestClient]Ali RestHighLevelClient inited!");
        return restHighLevelClient;
    }

    @Bean(name = "restClient58")
    public RestClient getRestClient58() {
        RestClientBuilder restClientBuilder = restClientBuilder(elasticSearch58Property);
        RestClient restClient = restClientBuilder.build();
        log.info("[RestClient]58 RestClient inited!");
        return restClient;
    }

    @Bean(name = "restClientAli")
    public RestClient getRestClientAli() {
        RestClientBuilder restClientBuilder = restClientBuilder(elasticSearchAliProperty);
        RestClient restClient = restClientBuilder.build();
        log.info("[RestClient]Ali RestClient inited!");
        return restClient;
    }

    private RestClientBuilder restClientBuilder(ElasticSearchProperty elasticSearchProperty) {
        // 认证配置
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        if (!StringUtils.isEmpty(elasticSearchProperty.getUsername()) || !StringUtils.isEmpty(elasticSearchProperty.getPassword())) {
            credentialsProvider.setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(elasticSearchProperty.getUsername(), elasticSearchProperty.getPassword()));
        }

        // 初始化RestClient
        return RestClient.builder(
                        new HttpHost(elasticSearchProperty.getUrl(), elasticSearchProperty.getPort(), "http")
                )
                .setHttpClientConfigCallback(httpClientBuilder -> {
                    httpClientBuilder
                            .setDefaultCredentialsProvider(credentialsProvider);
                    return httpClientBuilder;
                })
                .setRequestConfigCallback(requestConfigBuilder -> {
                    requestConfigBuilder
                            .setConnectTimeout(CONNECT_TIMEOUT)
                            .setSocketTimeout(SOCKET_TIMEOUT)
                            .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT);
                    return requestConfigBuilder;
                });
    }

}

3.常用查询API

查询API

等值(term)查询:QueryBuilders.termQuery(name,value);

多值(terms)查询:QueryBuilders.termsQuery(name,value,value2,value3…);

范围(range)查询:QueryBuilders.rangeQuery(name).gte(value).lte(value);

存在(exists)查询:QueryBuilders.existsQuery(name);

模糊(wildcard)查询:QueryBuilders.wildcardQuery(name,+value+);

组合(bool)查询: BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

1.查询所有代码示例

private static void allSearch() throws IOException {
    SearchRequest searchRequestAll = new SearchRequest();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    searchRequestAll.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponseAll = client.search(searchRequestAll, RequestOptions.DEFAULT);
    System.out.println("所有查询总数:" + searchResponseAll.getHits().getTotalHits());
}

 2.一般查询代码示例

private static void genSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 设置查询条件
    sourceBuilder.query(QueryBuilders.termQuery("uid", "1234"));
    // 设置起止和结束
    sourceBuilder.from(0);
    sourceBuilder.size(5);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    // 设置路由
//    searchRequest.routing("routing");
    // 设置索引库表达式
    searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
    // 查询选择本地分片,默认是集群分片
    searchRequest.preference("_local");

    // 排序
    // 根据默认值进行降序排序
//  sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
    // 根据字段进行升序排序
//  sourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.ASC));

    // 关闭suorce查询
//  sourceBuilder.fetchSource(false);

    String[] includeFields = new String[]{"title", "user", "innerObject.*"};
    String[] excludeFields = new String[]{"_type"};
    // 包含或排除字段
//  sourceBuilder.fetchSource(includeFields, excludeFields);

    searchRequest.source(sourceBuilder);
  System.out.println("普通查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    // HTTP状态代码、执行时间或请求是否提前终止或超时
    RestStatus status = searchResponse.status();
    TimeValue took = searchResponse.getTook();
    Boolean terminatedEarly = searchResponse.isTerminatedEarly();
    boolean timedOut = searchResponse.isTimedOut();

    // 供关于受搜索影响的切分总数的统计信息,以及成功和失败的切分
    int totalShards = searchResponse.getTotalShards();
    int successfulShards = searchResponse.getSuccessfulShards();
    int failedShards = searchResponse.getFailedShards();
    // 失败的原因
    for (ShardSearchFailure failure : searchResponse.getShardFailures()) {
        // failures should be handled here
    }
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        System.out.println("普通查询的结果:" + map);
    });
    System.out.println("\n=================\n");
}

3.或查询代码示例

private static void orSearch() throws IOException {
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("test1");
    searchRequest.types("_doc");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
 
      /**
     *  SELECT * FROM test1 where (uid = 1234 or uid =12345)  and phone = 12345678909
     * */
    boolQueryBuilder2.should(QueryBuilders.termQuery("uid", 1234));
    boolQueryBuilder2.should(QueryBuilders.termQuery("uid", 12345));
    boolQueryBuilder.must(boolQueryBuilder2);
    boolQueryBuilder.must(QueryBuilders.termQuery("phone", "12345678909"));
    searchSourceBuilder.query(boolQueryBuilder);
    System.out.println("或查询语句:" + searchSourceBuilder.toString());
    searchRequest.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    searchResponse.getHits().forEach(documentFields -> {

        System.out.println("查询结果:" + documentFields.getSourceAsMap());
    });

}

4.模糊查询代码示例

模糊查询,相当于SQL语句中的like查询。

private static void likeSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices(index);
    searchRequest.types(type);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

   /**
     *  SELECT * FROM p_test where  message like '%xu%';
     * */
    boolQueryBuilder.must(QueryBuilders.wildcardQuery("message", "*xu*"));
    searchSourceBuilder.query(boolQueryBuilder);
    System.out.println("模糊查询语句:" + searchSourceBuilder.toString());
    searchRequest.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    searchResponse.getHits().forEach(documentFields -> {
        System.out.println("模糊查询结果:" + documentFields.getSourceAsMap());
    });
    System.out.println("\n=================\n");
}

5.多值查询代码示例

多值查询,也就是相当于SQL语句中的in查询。

private static void inSearch() throws IOException {
        String type = "_doc";
        String index = "test1";
        // 查询指定的索引库
        SearchRequest searchRequest = new SearchRequest(index,type);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        /**
         *  SELECT * FROM p_test where uid in (1,2)
         * */
        // 设置查询条件
        sourceBuilder.query(QueryBuilders.termsQuery("uid", 1, 2));
        searchRequest.source(sourceBuilder);
      System.out.println("in查询的DSL语句:"+sourceBuilder.toString());
        // 同步查询
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        // 结果
        searchResponse.getHits().forEach(hit -> {
            Map<String, Object> map = hit.getSourceAsMap();
            String string = hit.getSourceAsString();
            System.out.println("in查询的Map结果:" + map);
            System.out.println("in查询的String结果:" + string);
        });

        System.out.println("\n=================\n");
    }

6.存在查询

判断是否存在该字段,用法和SQL语句中的exist类似。

 private static void existSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    // 设置查询条件
    sourceBuilder.query(QueryBuilders.existsQuery("msgcode"));
    searchRequest.source(sourceBuilder);
    System.out.println("存在查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        String string = hit.getSourceAsString();
        System.out.println("存在查询的Map结果:" + map);
        System.out.println("存在查询的String结果:" + string);
    });
    System.out.println("\n=================\n");
}

7.范围查询

和SQL语句中<>使用方法一样,其中gt是大于,lt是小于,gte是大于等于,lte是小于等于。

private static void rangeSearch() throws IOException{
    String type = "_doc";
    String index = "test1";
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    // 设置查询条件
    sourceBuilder.query(QueryBuilders.rangeQuery("sendtime").gte("2019-01-01 00:00:00").lte("2019-12-31 23:59:59"));
    searchRequest.source(sourceBuilder);
     System.out.println("范围查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        String string = hit.getSourceAsString();
        System.out.println("范围查询的String结果:" + string);
    });
    System.out.println("\n=================\n");
}

8.正则查询

ES可以使用正则进行查询,查询方式也非常的简单,代码示例如下:

private static void regexpSearch() throws IOException{
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 设置查询条件
    sourceBuilder.query(QueryBuilders.regexpQuery("message","xu[0-9]"));
    searchRequest.source(sourceBuilder);
   System.out.println("正则查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        String string = hit.getSourceAsString();
        System.out.println("正则查询的Map结果:" + map);
        System.out.println("正则查询的String结果:" + string);
    });

    System.out.println("\n=================\n");
}

总结

具体的api内容可详细了解。如下对象,其中较为常用的是BoolQueryBuilder。语法常用的为must、mustNot等。

UpdateByQueryRequest、
IndexRequest、UpdateRequest等
TermsAggregationBuilder、
BoolQueryBuilder...各类builder
查询api如
QueryBuilders.termQuery()、等值查询
QueryBuilders.boolQuery()、组合查询
QueryBuilders.nestedQuery()、嵌套查询
SortBuilders.fieldSort() 排序
语法如:
mustNot
should、
must、
filter

参考

java操作ElasticSearch(包含增删改查及基础语法操作)(二)-阿里云开发者社区

Elasticsearch——使用Java API实现ES中的索引、映射、文档操作(下)-阿里云开发者社区 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值