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接收異常
參考文件: