赞
踩
RestHighLevelClient查询ES中数据的API主要有:get、multiGet、search、multiSearch、searchScroll,每个方法还有异步查询的操作方法。下面我们就逐个看看这些API的应用。
- public class EsRestClient {
-
- private String IP;
- private int PORT;
- private String index;
- private String type;
- RestHighLevelClient client;
-
- @Before
- public void init() {
- this.IP = "192.168.5.166";
- this.PORT = 9200;
- this.index = "index3";
- this.type = "user1";
- client = new RestHighLevelClient(
- RestClient.builder(
- new HttpHost(IP, PORT, "http")));
- }
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException {
- return (GetResponse)this.performRequestAndParseEntity(getRequest, Request::get, GetResponse::fromXContent, Collections.singleton(404), headers);
- }
查询ES:
- @Test
- public void test1() throws IOException {
- GetRequest getRequest = new GetRequest(index);
- getRequest.id("1");
- String[] includes = new String[]{"*", "birthday"};
- String[] excludes = Strings.EMPTY_ARRAY;
- FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
- getRequest.fetchSourceContext(fetchSourceContext);
- GetResponse response = client.get(getRequest);
- System.out.println(response.getSource().keySet().toString());
- }
输出结果:
get方法查询es接收的参数为GetRequest,我们先要构建GetRequest对象才可以对ES进行查询
- public class GetRequest extends SingleShardRequest<GetRequest> implements RealtimeRequest {
- private String type;
- private String id;
- private String routing;
- private String parent;
- private String preference;
- private String[] storedFields;
- private FetchSourceContext fetchSourceContext;
- private boolean refresh = false;
- boolean realtime = true;
- private VersionType versionType;
- private long version;
- ......
- ...
- ...
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
在GetRequest对象中设置我们要查询的es索引(index)、类型(type)、 id、路由、分片、版本 等信息,也可以指定展示我们要查询的特定的列或排除的列信息FetchSourceContext。get查询是根据ID进行精确匹配的插叙,查询的参数封装在GetRequest中。
- public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException {
- return (MultiGetResponse)this.performRequestAndParseEntity(multiGetRequest, Request::multiGet, MultiGetResponse::fromXContent, Collections.singleton(404), headers);
- }
一次查询多个ID数据:
- @Test
- public void test2() throws IOException {
- String[] includes = new String[]{"*", "birthday"};
- String[] excludes = Strings.EMPTY_ARRAY;
- FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
- MultiGetRequest multiGetRequest = new MultiGetRequest();
- multiGetRequest.add(new MultiGetRequest.Item(index,type,"1").fetchSourceContext(fetchSourceContext)); //通过Item添加查询条件
- multiGetRequest.add(index,type,"2"); //直接添加查询条件
- MultiGetResponse multiGetItemResponses = client.multiGet(multiGetRequest);
- MultiGetItemResponse[] responses = multiGetItemResponses.getResponses();
- for(MultiGetItemResponse response : responses){
- System.out.println(response.getResponse().getSource().keySet().toString());
- }
- }
输出结果:
MultiGetRequest类内还定义了一个内部类Item,查询条件都封装在Item中。上面我们添加了两个查询条件,一个是通过Item内部类的构造函数添加,另一个是调用MultiGetRequest的add方法添加,其实都是创建一个新的Item对象。下面是add方法添加查询条件的源码:
- public MultiGetRequest add(String index, @Nullable String type, String id) {
- this.items.add(new MultiGetRequest.Item(index, type, id));
- return this;
- }
get查询我们只能根据ID进行精确查询,而search查询,我们可以自定义查询字段进行查询。
- public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException {
- return (SearchResponse)this.performRequestAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, Collections.emptySet(), headers);
- }
查询:
- @Test
- public void test3() {
- SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
- sourceBuilder.from(0);
- sourceBuilder.size(10);
- sourceBuilder.fetchSource(new String[]{"*"}, Strings.EMPTY_ARRAY);
-
- MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "rabbit");
- MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("YunZhiHui", "address", "company");
- TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("interest", "game steak");
- RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("birthday");
- rangeQueryBuilder.gte("2018-01-26");
- rangeQueryBuilder.lte("2019-01-26");
-
- BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
- boolBuilder.must(matchQueryBuilder);
- boolBuilder.must(termQueryBuilder);
- boolBuilder.must(rangeQueryBuilder);
- boolBuilder.should(multiMatchQueryBuilder);
-
- sourceBuilder.query(boolBuilder);
- SearchRequest searchRequest = new SearchRequest(index);
- searchRequest.types(type);
- searchRequest.source(sourceBuilder);
- try {
- SearchResponse response = client.search(searchRequest);
- System.out.println(response);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
search查询的主要参数是SearchRequest,我们的查询条件index、type、字段、字段值 都封装在SearchRequest中;而index、type是直接封装在SearchRequest的对象中,查询的字段、字段值、查询方式则封装在SearchRequest中的对象属性SearchSourceBuilder中。
下面是SearchRequest的部分属性:
- public final class SearchRequest extends ActionRequest implements Replaceable {
- private SearchType searchType;
- private String[] indices;
- @Nullable
- private String routing;
- @Nullable
- private String preference;
- private SearchSourceBuilder source; //封装查询条件
- private Boolean requestCache;
- private Scroll scroll;
- private int batchedReduceSize;
- private int maxConcurrentShardRequests;
- private int preFilterShardSize;
- private String[] types;
- private IndicesOptions indicesOptions;
-
- ......
- ......
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
从上面的test3中可以看出,要想构建出SearchSourceBuilder,还需要两个类:BoolQueryBuilder、QueryBuilders。BoolQueryBuilder用于构建bool查询的查询条件,也是在实际应用中使用较多的查询。QueryBuilder用于构建match、term、multiMatch等查询。如果我们的查询条件很简单,只需要match、term、multiMatch也可以不适用BoolQueryBuilder,而直接使用QueryBuilders构建出来的QueryBuilder对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。