elasticsearch(二)java 使用同步步方法进行查询操作

版权声明:本文为博主原创文章,如果转载请务必注明出自本博客:qq_2300688967,否则追究责任。 https://blog.csdn.net/qq_2300688967/article/details/83818289

一、 基本步骤:

1)创建连接对象:

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")
                )
        );

2)创建请求对象:

 GetRequest getRequest = new GetRequest("posts", "doc", "16");

3)为请求对象设置参数:

(1)设置查询的版本:
getRequest.version(2) 可以不设置,如果设置所要查询的文档版本号为2,如果当前版本号为4,则查询失败,报错如下

{
    "error":{
        "root_cause":[
            {
                "type":"version_conflict_engine_exception",
                "reason":"[doc][16]: version conflict, current version [4] is different than the one provided [2]",
                "index_uuid":"60e-U9cXSYqFGC34_gTrug",
                "shard":"3",
                "index":"posts"
            }
        ],
        "type":"version_conflict_engine_exception",
        "reason":"[doc][16]: version conflict, current version [4] is different than the one provided [2]",
        "index_uuid":"60e-U9cXSYqFGC34_gTrug",
        "shard":"3",
        "index":"posts"
    },
    "status":409
}

 (2)设置查询的参数

a. 查询文档中指定的字段(如message和以Date结尾的字段): String[] includes = new String[]{"message", "*Date"} 

查询文档中所有的字段:String[] includes = Strings.EMPTY_ARRAY;

b. 过滤掉文档中指定的字段(如message): String[] excludes = new String[]{"message"};

不过滤文档中任何字段:String[] excludes = Strings.EMPTY_ARRAY;

c. FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);

其中includes可以传null,此时表示查询所有的字段

excludes也可以为null,此时表示不过滤掉任何字段

注: 如果includes和excludes包含同一个字段,则excludes起作用,也就是查询的字段会被过滤掉

d. 将设置的查询参数赋值给请求对象:

getRequest.fetchSourceContext(fetchSourceContext);

e.如果不希望返回结果中包含内容,可以进行如下设置:

getRequest.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);

默认是返回全部内容的

 

 

二、进行同步查询:

1,执行方法:
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);

2,根据返回的结果:

a.判断文档是否存在:

getResponse.isExists(),如果为true,则存在

b.将查询的文档内容转成字符串:

String sourceAsString = getResponse.getSourceAsString();

c.将查询的文档内容转换成Map对象:

Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();

3,同步方法查询的完整代码示例:

package com.example.elasticsearch.main;


import org.apache.http.HttpHost;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;

import java.io.IOException;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: Weichang Zhong
 * @Date: 2018/11/7
 * @Time: 9:15
 * @Description:
 */
public class GetRequestMain {

    public static void main(String[] args) throws Exception{
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")
                )
        );


        GetRequest getRequest = new GetRequest("posts", "doc", "16");
        getRequest.version(4);
        String[] includes = new String[]{"message", "*Date"};
        String[] excludes = Strings.EMPTY_ARRAY;
        FetchSourceContext fetchSourceContext =
                new FetchSourceContext(true, includes, excludes);
        getRequest.fetchSourceContext(fetchSourceContext);

        try {
            GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
            String index = getResponse.getIndex();
            String type = getResponse.getType();
            String id = getResponse.getId();
            System.out.println("index:" + index + "; type:" + type + "; id:" + id);
            if (getResponse.isExists()) {
                long version = getResponse.getVersion();
                String sourceAsString = getResponse.getSourceAsString();
                System.out.println("version:" + version + ",内容字符串:" + sourceAsString);
                Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
                byte[] sourceAsBytes = getResponse.getSourceAsBytes();
            } else {
                System.out.println("所查询的文档不存在!");
            }
        } catch (ElasticsearchException e) {
            if (e.status() == RestStatus.NOT_FOUND) {
                System.out.println("所查询的文档库不存在!");
            }else if(e.status() == RestStatus.CONFLICT) {
                System.out.println("与当前版本冲突");
            }
        }
    }
}

注意:无论文档类型或id不存在,只要文档库存在,getResponse都会得到返回的结果

而要是文档库不存在:GetRequest request = new GetRequest("does_not_exist", "doc", "1"); 或版本冲突,则查询结果会报异常,并以ElasticsearchException接收异常

参考文档:

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.4/java-rest-high-document-get.html#java-rest-high-document-get-request

猜你喜欢

转载自blog.csdn.net/qq_2300688967/article/details/83818289