1. 程式人生 > >elasticsearch(二)java 使用同步步方法進行查詢操作

elasticsearch(二)java 使用同步步方法進行查詢操作

一、 基本步驟:

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