当前位置:   article > 正文

Java操作ES(三):RestHighLevelClient查询ES_es resthighlevelclient

es resthighlevelclient

RestHighLevelClient查询ES中数据的API主要有:get、multiGet、search、multiSearch、searchScroll,每个方法还有异步查询的操作方法。下面我们就逐个看看这些API的应用。

链接ES构建客户端:

  1. public class EsRestClient {
  2. private String IP;
  3. private int PORT;
  4. private String index;
  5. private String type;
  6. RestHighLevelClient client;
  7. @Before
  8. public void init() {
  9. this.IP = "192.168.5.166";
  10. this.PORT = 9200;
  11. this.index = "index3";
  12. this.type = "user1";
  13. client = new RestHighLevelClient(
  14. RestClient.builder(
  15. new HttpHost(IP, PORT, "http")));
  16. }
  17. }

get方法查询:

  1. public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException {
  2. return (GetResponse)this.performRequestAndParseEntity(getRequest, Request::get, GetResponse::fromXContent, Collections.singleton(404), headers);
  3. }

查询ES:

  1. @Test
  2. public void test1() throws IOException {
  3. GetRequest getRequest = new GetRequest(index);
  4. getRequest.id("1");
  5. String[] includes = new String[]{"*", "birthday"};
  6. String[] excludes = Strings.EMPTY_ARRAY;
  7. FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
  8. getRequest.fetchSourceContext(fetchSourceContext);
  9. GetResponse response = client.get(getRequest);
  10. System.out.println(response.getSource().keySet().toString());
  11. }

输出结果:

get方法查询es接收的参数为GetRequest,我们先要构建GetRequest对象才可以对ES进行查询

  1. public class GetRequest extends SingleShardRequest<GetRequest> implements RealtimeRequest {
  2. private String type;
  3. private String id;
  4. private String routing;
  5. private String parent;
  6. private String preference;
  7. private String[] storedFields;
  8. private FetchSourceContext fetchSourceContext;
  9. private boolean refresh = false;
  10. boolean realtime = true;
  11. private VersionType versionType;
  12. private long version;
  13. ......
  14. ...
  15. ...
  16. }

在GetRequest对象中设置我们要查询的es索引(index)、类型(type)、 id、路由、分片、版本 等信息,也可以指定展示我们要查询的特定的列或排除的列信息FetchSourceContext。get查询是根据ID进行精确匹配的插叙,查询的参数封装在GetRequest中。

multiGet查询:

  1. public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException {
  2. return (MultiGetResponse)this.performRequestAndParseEntity(multiGetRequest, Request::multiGet, MultiGetResponse::fromXContent, Collections.singleton(404), headers);
  3. }

一次查询多个ID数据:

  1. @Test
  2. public void test2() throws IOException {
  3. String[] includes = new String[]{"*", "birthday"};
  4. String[] excludes = Strings.EMPTY_ARRAY;
  5. FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
  6. MultiGetRequest multiGetRequest = new MultiGetRequest();
  7. multiGetRequest.add(new MultiGetRequest.Item(index,type,"1").fetchSourceContext(fetchSourceContext)); //通过Item添加查询条件
  8. multiGetRequest.add(index,type,"2"); //直接添加查询条件
  9. MultiGetResponse multiGetItemResponses = client.multiGet(multiGetRequest);
  10. MultiGetItemResponse[] responses = multiGetItemResponses.getResponses();
  11. for(MultiGetItemResponse response : responses){
  12. System.out.println(response.getResponse().getSource().keySet().toString());
  13. }
  14. }

输出结果:

MultiGetRequest类内还定义了一个内部类Item,查询条件都封装在Item中。上面我们添加了两个查询条件,一个是通过Item内部类的构造函数添加,另一个是调用MultiGetRequest的add方法添加,其实都是创建一个新的Item对象。下面是add方法添加查询条件的源码:

  1. public MultiGetRequest add(String index, @Nullable String type, String id) {
  2. this.items.add(new MultiGetRequest.Item(index, type, id));
  3. return this;
  4. }

search查询:

get查询我们只能根据ID进行精确查询,而search查询,我们可以自定义查询字段进行查询。

  1. public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException {
  2. return (SearchResponse)this.performRequestAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, Collections.emptySet(), headers);
  3. }

查询:

  1. @Test
  2. public void test3() {
  3. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  4. sourceBuilder.from(0);
  5. sourceBuilder.size(10);
  6. sourceBuilder.fetchSource(new String[]{"*"}, Strings.EMPTY_ARRAY);
  7. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "rabbit");
  8. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("YunZhiHui", "address", "company");
  9. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("interest", "game steak");
  10. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("birthday");
  11. rangeQueryBuilder.gte("2018-01-26");
  12. rangeQueryBuilder.lte("2019-01-26");
  13. BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
  14. boolBuilder.must(matchQueryBuilder);
  15. boolBuilder.must(termQueryBuilder);
  16. boolBuilder.must(rangeQueryBuilder);
  17. boolBuilder.should(multiMatchQueryBuilder);
  18. sourceBuilder.query(boolBuilder);
  19. SearchRequest searchRequest = new SearchRequest(index);
  20. searchRequest.types(type);
  21. searchRequest.source(sourceBuilder);
  22. try {
  23. SearchResponse response = client.search(searchRequest);
  24. System.out.println(response);
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }

search查询的主要参数是SearchRequest,我们的查询条件index、type、字段、字段值 都封装在SearchRequest中;而index、type是直接封装在SearchRequest的对象中,查询的字段、字段值、查询方式则封装在SearchRequest中的对象属性SearchSourceBuilder中。

下面是SearchRequest的部分属性:

  1. public final class SearchRequest extends ActionRequest implements Replaceable {
  2. private SearchType searchType;
  3. private String[] indices;
  4. @Nullable
  5. private String routing;
  6. @Nullable
  7. private String preference;
  8. private SearchSourceBuilder source; //封装查询条件
  9. private Boolean requestCache;
  10. private Scroll scroll;
  11. private int batchedReduceSize;
  12. private int maxConcurrentShardRequests;
  13. private int preFilterShardSize;
  14. private String[] types;
  15. private IndicesOptions indicesOptions;
  16. ......
  17. ......

从上面的test3中可以看出,要想构建出SearchSourceBuilder,还需要两个类:BoolQueryBuilder、QueryBuilders。BoolQueryBuilder用于构建bool查询的查询条件,也是在实际应用中使用较多的查询。QueryBuilder用于构建match、term、multiMatch等查询。如果我们的查询条件很简单,只需要match、term、multiMatch也可以不适用BoolQueryBuilder,而直接使用QueryBuilders构建出来的QueryBuilder对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/68582
推荐阅读
相关标签
  

闽ICP备14008679号