使用RestHighLevelClient 请求ES数据

14 篇文章 1 订阅

目录

过程:

0,引用:

1,RestHighLevelClient 查询的方式:

代码:

2,EsQuery查参数

3,EsOrder排序:

4,SearchEsHits

总结:


RestHighLevelClient 请求ES数据

使用Java请求es,如何使用RestHighLevelClient 进行请求查询,获取到数据呢?

过程:

0,引用:

引用文件:

 

Maven:

<dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
   <version>6.8.2</version>
</dependency>

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

<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client</artifactId>
   <version>6.8.2</version>
</dependency>

<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>x-pack-transport</artifactId>
   <version>6.8.12</version>
</dependency>

Yml:

elasticsearch:
    cluster:
        name: elastic
    hosts: ip:port
    address: ip:port
 
xpack:
    security:
        user: elastic:elastic
        enabled: true

1,RestHighLevelClient 查询的方式:

public void getHisResultOri() {
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    SearchRequest searchRequest = new SearchRequest();
    // 查询的索引
    searchRequest.indices("check_data_index");
    // query 的查询
    QueryBuilder queryBuilder = QueryBuilders.wrapperQuery("{\"bool\":{\"must\":{\"terms\":{\"make.keyword\":[\"toyota\"]}}}}");
    searchSourceBuilder.query(queryBuilder);
    searchRequest.source(searchSourceBuilder);
    // 排序
    searchSourceBuilder.sorts().add(SortBuilders.fieldSort("price").order(SortOrder.fromString("desc")));
    // from size
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(10);

    try {
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        logger.info(JSON.toJSONString(searchResponse));
        SearchHits hits = searchResponse.getHits();

        SearchHit[] searchHits = hits.getHits();
        logger.info("search hit size :{},{}", hits.getTotalHits(), searchHits.length);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

分析:

在查询中,设置索引,query的查询参数,排序,开始(from),个数(size),五个的内容。 排序 包括 字段和排序方式。简易的添加两个相关的类:

代码:

2,EsQuery查参数

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.List;

@ApiModel(value = "es查询参数")
public class EsQuery {

    @ApiModelProperty("es索引")
    private String sourceIndex;

    @ApiModelProperty("第几页")
    private Integer page;

    @ApiModelProperty("分页大小")
    private Integer size;

    @ApiModelProperty("查询参数")
    private String sourceExpr;

    @ApiModelProperty("排序")
    private List<EsOrder> orders;

    public String getSourceIndex() {
        return sourceIndex;
    }

    public void setSourceIndex(String sourceIndex) {
        this.sourceIndex = sourceIndex;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    public String getSourceExpr() {
        return sourceExpr;
    }

    public void setSourceExpr(String sourceExpr) {
        this.sourceExpr = sourceExpr;
    }

    public List<EsOrder> getOrders() {
        return orders;
    }

    public void setOrders(List<EsOrder> orders) {
        this.orders = orders;
    }

    @Override
    public String toString() {
        return "{" +
                "sourceIndex='" + sourceIndex + '\'' +
                ", page=" + page +
                ", size=" + size +
                ", sourceExpr='" + sourceExpr + '\'' +
                ", orders=" + orders +
                '}';
    }
}

3,EsOrder排序:

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(value = "es排序")
public class EsOrder {

    @ApiModelProperty("排序字段")
    private String fieldName;

    @ApiModelProperty("排序方式:ASC,DESC")
    private String orderBy;

    public EsOrder(String fieldName, String orderBy) {
        this.fieldName = fieldName;
        this.orderBy = orderBy;
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getOrderBy() {
        return orderBy;
    }

    public void setOrderBy(String orderBy) {
        this.orderBy = orderBy;
    }
}

4SearchEsHits

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import es.search.highLevel.entity.EsOrder;
import es.search.highLevel.entity.EsQuery;
import org.apache.commons.collections4.CollectionUtils;
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.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SearchEsHits {

    @Autowired
    private RestHighLevelClient highLevelClient;


    private static Logger logger = LoggerFactory.getLogger(SearchEsHits.class);


    public void getHitsResult(EsQuery esQuery) {

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        SearchRequest searchRequest = new SearchRequest();
        // 查询的索引
        searchRequest.indices(esQuery.getSourceIndex());
        // query 的查询
        String sourceExpr = esQuery.getSourceExpr();
        if (sourceExpr.contains("query")) {// 带有query的查询
            sourceExpr = JSONObject.parseObject(sourceExpr).getJSONObject("query").toJSONString();
        }
        QueryBuilder queryBuilder = QueryBuilders.wrapperQuery(sourceExpr);
        searchSourceBuilder.query(queryBuilder); 
        searchRequest.source(searchSourceBuilder);
        // 排序
        List<EsOrder> orders = esQuery.getOrders();
        if (CollectionUtils.isNotEmpty(orders)) {
            for (EsOrder e : orders) {
                searchSourceBuilder.sort(new FieldSortBuilder(e.getFieldName()).order(SortOrder.fromString(e.getOrderBy())));
            }
        }
        // from size
        int start = esQuery.getPage() * esQuery.getSize();
        searchSourceBuilder.from(start);
        searchSourceBuilder.size(esQuery.getSize());


        try {
            SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            logger.info(JSON.toJSONString(searchResponse));
            SearchHits hits = searchResponse.getHits();
            List<JSONObject> hitsList = new ArrayList<>();
            SearchHit[] searchHits = hits.getHits();
            logger.info("search hit size :{},{}", hits.getTotalHits(), searchHits.length);
            for (SearchHit hit : searchHits) {
                String result = hit.getSourceAsString();
                JSONObject jsonObject = JSONObject.parseObject(result);
                hitsList.add(jsonObject);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

PS: 这边没有对返回值,总数进一步处理,可以根据自己的需求再处理。

总结:

        使用RestHighLevelClient查询es数据,可以使用QueryBuilders.wrapperQuery(sourceExpr)处理query的数据就会方便很多,使用boolQuery查询的话,会比较崩溃。查询聚合的方式就不得不单独处理了。

关联文章: 《使用commons-httpclinet 请求ES数据》

下一篇: 《使用RestHighLevelClient 请求ES统计数据》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值