Elasticsearch
是基于 Lucene
開發的一個分布式全文檢索框架,向 Elasticsearch
中存儲和從 Elasticsearch
中查詢,格式是json。
向 Elasticsearch
中存儲數據,其實就是向 es
中的 index
下面的 type
中存儲 json
類型的數據。
elasticsearch
提供了很多語言的客戶端用于操作 elasticsearch
服務,例如: java
、 python
、 .net
、 JavaScript
、 PHP
等。本文主要介紹如何使用 java
語言來操作 elasticsearch
服務。在 elasticsearch
的官網上提供了兩種 java
語言的 API
,一種是 Java Transport Client
,一種是 Java REST Client
。
Java Transport Client
** 是基于 TCP 協議交互的,**在elasticsearch 7.0+
版本后官方不再贊成使用,在Elasticsearch 8.0的版本中完全移除TransportClient
**
Java REST Client
是基于 HTTP 協議交互,**而Java REST Client
又分為Java Low Level REST Client
和Java High Level REST Client
Java High Level REST Client
是在 Java Low Level REST Client
的基礎上做了封裝,使其以更加面向對象和操作更加便利的方式調用 elasticsearch
服務。官方推薦使用
Java High Level REST Client
,因為在實際使用中,Java Transport Client
在大并發的情況下會出現連接不穩定的情況。那接下來我們就來看看elasticsearch
提供的Java High Level REST Client
(以下簡稱高級REST客戶端)的一些基礎的操作,跟多的操作大家自行閱讀elasticsearch的官方文檔:[https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html)
環境:
Windows 10
elasticsearch 7.91
IDEA
Maven
Java 8
高級客戶端需要
Java 1.8
并依賴于Elasticsearch core
項目
依賴:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.1</version>
</dependency>
RestHighLevelClient
RestHighLevelClient client=new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
close
client.close();
在有關 Java 高級客戶端的本文檔的其余部分中,實例將引用為 。
RestHighLevelClient
client
案例:
index
代碼:public static void main(String[] args) {
RestClientBuilder builder=RestClient.builder(
new HttpHost(
"127.0.0.1", //es主機 IP
9200 // es 端口http
)
);
RestHighLevelClient client=new RestHighLevelClient(builder);
GetRequest request=new GetRequest(
"blog1", //索引
"1" //文檔ID
);
//當針對不存在的索引執行獲取請求時,響應404狀態碼,將引發IOException,需要按如下方式處理:
GetResponse documentFields=null;
try {
documentFields=client.get(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
////處理因為索引不存在而拋出的異常情況
}
System.out.println(documentFields);
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
{
"_index": "blog1",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"age": 1,
"country": "fuzhou",
"date": "2020-09-10",
"name": "ngitvusercancel"
}
}
上述是一個案例的展示,讓我們初步了解通過
Java
的高級restful
客戶端來訪問, 下面我們將進行相關Api
的介紹
**
/*
* 創建索引.
* url:https://i-code.online/
*/
public static void main(String[] args) {
//創建鏈接信息
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//創建索引請求 索引名稱 student
CreateIndexRequest createIndexRequest=new CreateIndexRequest("student-1");
//創建索引時可以設置與之相關的 特定配置
createIndexRequest.settings(Settings.builder()
.put("index.number_of_shards",3) //分片數
.put("index.number_of_replicas",2) //備份數
);
//創建文檔類型映射
createIndexRequest.mapping("{\n" +
" \"properties\": {\n" +
" \"id\": {\n" +
" \"type\": \"long\",\n" +
" \"store\": true\n" +
" },\n" +
" \"name\": {\n" +
" \"type\": \"text\",\n" +
" \"index\": true,\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" },\n" +
" \"content\": {\n" +
" \"type\": \"text\",\n" +
" \"index\": true,\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" }\n" +
" }\n" +
"}",
XContentType.JSON //類型映射,需要的是一個JSON字符串
);
//可選參數
//超時,等待所有節點被確認(使用TimeValue方式)
createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));
try {
//同步執行
CreateIndexResponse createIndexResponse=client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
//返回的CreateIndexResponse允許檢索有關執行的操作的信息,如下所示:
boolean acknowledged=createIndexResponse.isAcknowledged();//指示是否所有節點都已確認請求
boolean shardsAcknowledged=createIndexResponse.isShardsAcknowledged();//指示是否在超時之前為索引中的每個分片啟動了必需的分片副本數
System.out.println("acknowledged:"+acknowledged);
System.out.println("shardsAcknowledged:"+shardsAcknowledged);
System.out.println(createIndexResponse.index());
} catch (IOException e) {
e.printStackTrace();
}
try {
//關閉客戶端鏈接
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上述是一個 index 創建的過程,具體的細節操作
api
下面詳解
CreateIndexRequestindex
CreateIndexRequest request=new CreateIndexRequest("twitter");//<1>
<1>要創建索引
//此索引的設置
request.settings(Settings.builder()
.put("index.number_of_shards", 3) //分片數
.put("index.number_of_replicas", 2)//備份數
);
request.mapping(
"{\n" +
" "properties": {\n" +
" "message": {\n" +
" "type": "text"\n" +
" }\n" +
" }\n" +
"}", //<1> 要定義的類型
XContentType.JSON); //<2> 此類型的映射,作為 JSON 字符串提供
<1>要定義的類型<2>此類型的映射,作為
JSON
字符串提供
String
Map<String, Object> message=new HashMap<>();
message.put("type", "text");
Map<String, Object> properties=new HashMap<>();
properties.put("message", message);
Map<String, Object> mapping=new HashMap<>();
mapping.put("properties", properties);
request.mapping(mapping); //接受map的映射集合,自動轉為 json
提供自動轉換為
JSON
格式的映射源Map
這種方式多層嵌套,在使用過程中注意嵌套,上面標簽嵌套:properties -> message -> type
XContentBuilder builder=XContentFactory.jsonBuilder(); // 使用XContentBuilder內容生成器
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("message");
{
builder.field("type", "text");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
映射作為對象提供的源,彈性搜索內置幫助器,用于生成
JSON
內容XContentBuilder
request.alias(new Alias("twitter_alias").filter(QueryBuilders.termQuery("user", "kimchy"))); //要定義的別名
request.source("{\n" +
" \"settings\" : {\n" +
" \"number_of_shards\" : 1,\n" +
" \"number_of_replicas\" : 0\n" +
" },\n" +
" \"mappings\" : {\n" +
" \"properties\" : {\n" +
" \"message\" : { \"type\" : \"text\" }\n" +
" }\n" +
" },\n" +
" \"aliases\" : {\n" +
" \"twitter_alias\" : {}\n" +
" }\n" +
"}", XContentType.JSON);
作為 JSON 字符串提供的源。它也可以作為 或 提供。MapXContentBuilder
request.setTimeout(TimeValue.timeValueMinutes(2));
超時以等待所有節點將索引創建確認為
TimeValue
request.setMasterTimeout(TimeValue.timeValueMinutes(1));
以作為
TimeValue
request.waitForActiveShards(ActiveShardCount.from(2));
request.waitForActiveShards(ActiveShardCount.DEFAULT);
在創建索引
API
返回響應之前等待的活動分片副本數,作為in
t在創建索引API
返回響應之前等待的活動分片副本數,作為ActiveShardCount
CreateIndexRequest CreateIndexResponse
CreateIndexResponse createIndexResponse=client.indices().create(request, RequestOptions.DEFAULT);
同步調用可能會引發 在高級 REST 客戶端中無法解析 REST 響應、請求會發出時間或類似情況下沒有從服務器返回的響應的情況下。
IOException
在服務器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應正文錯誤詳細信息,然后引發泛型,并將原始代碼添加為抑制異常。4xx 5xx ElasticsearchExceptionResponseException
CreateIndexRequest
client.indices().createAsync(request, RequestOptions.DEFAULT, listener);
執行完成時要執行和要使用的
CreateIndexRequest ActionListener
onResponse
方法調用 ,如果執行失敗,則使用 onFailure
該方法。失敗方案和預期異常與同步執行案例相同。 ActionListener
ActionListener<CreateIndexResponse> listener=new ActionListener<CreateIndexResponse>() {
@Override
public void onResponse(CreateIndexResponse createIndexResponse) {
//成功執行時調用。
}
@Override
public void onFailure(Exception e) {
//當整個失敗時調用
}
};
CreateIndexResponse
boolean acknowledged=createIndexResponse.isAcknowledged(); // <1>
boolean shardsAcknowledged=createIndexResponse.isShardsAcknowledged(); // <2>
<1> 指示所有節點是否都已確認請求
<2> 指示在計時之前是否為索引中的每個分片啟動所需的分片副本數
/**
* 刪除索引.
* url:https://i-code.online/
* @param args
*/
public static void main(String[] args) {
//1. 創建客戶端
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//2. 創建DeleteIndexRequest 接受 index(索引名) 參數
DeleteIndexRequest request=new DeleteIndexRequest("student");
//超時以等待所有節點確認索引刪除 參數為 TimeValue 類型
request.timeout(TimeValue.timeValueMinutes(1));
//連接master節點的超時時間(使用TimeValue方式)
request.masterNodeTimeout(TimeValue.timeValueMinutes(1));
try {
// 調用delete
AcknowledgedResponse response=client.indices().delete(request, RequestOptions.DEFAULT);
System.out.printf("isAcknowledged:%s", response.isAcknowledged());
} catch (IOException e) {
e.printStackTrace();
}
}
DeleteIndexRequestindex
DeleteIndexRequest request=new DeleteIndexRequest("posts");//<1> <1> 索引(index)名
<1> 索引(index)名
request.timeout(TimeValue.timeValueMinutes(2));
request.timeout("2m");
超時以等待所有節點確認索引刪除為
TimeValue
類型
超時以等待所有節點確認索引刪除為
String
類型
request.masterNodeTimeout(TimeValue.timeValueMinutes(1));//連接master節點的超時時間(使用TimeValue方式)
request.masterNodeTimeout("1m");//連接master節點的超時時間(使用字符串方式)
連接master節點的超時時間(使用TimeValue方式)連接master節點的超時時間(使用字符串方式)
request.indicesOptions(IndicesOptions.lenientExpandOpen());
設置控制如何解析不可用的索引以及如何展開通配符表達式IndicesOptions
DeleteIndexRequest
時,客戶端將等待 DeleteIndexResponse
返回 ,然后再繼續執行代碼: DeleteIndexRequest
DeleteIndexResponse
AcknowledgedResponse deleteIndexResponse=client.indices().delete(request, RequestOptions.DEFAULT);
同步調用可能會引發 在高級
REST
客戶端中無法解析REST
響應、請求會發出時間或類似情況下沒有從服務器返回的響應的情況下。IOException
在服務器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應正文錯誤詳細信息,然后引發泛型,并將原始代碼添加為抑制異常。4xx 5xx ElasticsearchExceptionResponseException
DeleteIndexRequest
client.indices().deleteAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 執行完成時要執行和要使用的DeleteIndexRequest ActionListener
異步方法不會阻止并立即返回。完成后,如果執行成功完成,則使用 ActionListener#onResponse
方法調用 ,如果執行失敗,則使用 ActionListener#
onFailure
該方法。失敗方案和預期異常與同步執行案例相同。
典型的偵聽器如下所示:delete-index
ActionListener<AcknowledgedResponse> listener=new ActionListener<AcknowledgedResponse>() {
@Override
public void onResponse(AcknowledgedResponse deleteIndexResponse) {
//成功執行時調用。
}
@Override
public void onFailure(Exception e) {
//當整個失敗時調用。DeleteIndexRequest
}
};
DeleteIndexResponse
boolean acknowledged=deleteIndexResponse.isAcknowledged(); //<1> 指示所有節點是否都已確認請求
<1> 指示所有節點是否都已確認請求
ElasticsearchException
try {
DeleteIndexRequest request=new DeleteIndexRequest("does_not_exist");
client.indices().delete(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status()==RestStatus.NOT_FOUND) {
//如果未找到要刪除的索引,則進行""
}
}
如果未找到要刪除的索引,則進行""
/**
* 索引是否存在Api
* url:www.i-code.online
* @param args
*/
public static void main(String[] args) {
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//創建請求
GetIndexRequest request=new GetIndexRequest("student");
//<1> 是返回本地信息還是從主節點檢索狀態
request.local(false);
//<2> 返回結果為適合人類的格式
request.humanReadable(true);
try {
boolean exists=client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
} catch (IOException e) {
e.printStackTrace();
}
}
GetIndexRequest
GetIndexRequest request=new GetIndexRequest("twitter"); //<1> index 名稱
<1> index 名稱
GetIndexRequest
request.local(false);//<1> 是返回本地信息還是從主節點檢索狀態
request.humanReadable(true); //<2> 返回結果為適合人類的格式
request.includeDefaults(false); //<3> 是否返回每個索引的所有默認設置
request.indicesOptions(indicesOptions); //<4> 控制如何解析不可用的索引以及如何展開通配符表達式
<1> 是返回本地信息還是從主節點檢索狀態<2> 返回結果為適合人類的格式<3> 是否返回每個索引的所有默認設置<4> 控制如何解析不可用的索引以及如何展開通配符表達式
GetIndexRequest
boolean
boolean exists=client.indices().exists(request, RequestOptions.DEFAULT);
與其他同步的相同
-
GetIndexRequest
client.indices().existsAsync(request, RequestOptions.DEFAULT, listener);//<1>執行完成時要執行和要使用的 GetIndexRequest ActionListener
<1>執行完成時要執行和要使用的
GetIndexRequest
ActionListener
異步的處理邏輯與其他異步的相同,都是實現ActionListener
的方法
boolean
private static void test02() {
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//創建請求, 參數index名稱
IndexRequest request=new IndexRequest("student");
//請求的模式,CREATE: 創建模式,如果已經存在則報錯 Index:存在則不再創建,也不報錯
request.opType(DocWriteRequest.OpType.INDEX);
String json="{\n" +
" \"id\": 12,\n" +
" \"name\": \"admin\",\n" +
" \"content\": \"步的處理邏輯與其他異步的相同,都是實現ActionListener 的方法\"\n" +
"}";
request.id("1").source(
json,
XContentType.JSON
);
IndexResponse indexResponse=null;
try {
//調用 index 方法
indexResponse=client.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.getVersion());
System.out.println(indexResponse.getIndex());
System.out.println(indexResponse.getId());
System.out.println(indexResponse.status());
} catch (ElasticsearchStatusException | IOException e) {
e.printStackTrace();
}
}
IndexRequest
//創建請求, 參數index名稱
IndexRequest request=new IndexRequest("student"); //<1> index 名稱
String json="{\n" +
" \"id\": 12,\n" +
" \"name\": \"admin\",\n" +
" \"content\": \"步的處理邏輯與其他異步的相同,都是實現ActionListener 的方法\"\n" +
"}";
request
.id("1") // <2> 指定文檔 ID
.source(
json,
XContentType.JSON // <3> 指定參數類型,json
);
<1> index 名稱指數
<2> 請求的文檔 ID
<3> 指定參數類型,json
提供文檔源
String
Map<String, Object> jsonMap=new HashMap<>();
jsonMap.put("id", 1);
jsonMap.put("name", "Admin);
jsonMap.put("content", "步的處理邏輯與其他異步的相同");
IndexRequest indexRequest=new IndexRequest("student").id("1").source(jsonMap);
文檔源作為 自動轉換為
JSON
格式的Map
XContentBuilder builder=XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("id", 1);
builder.field("name", "admin);
builder.field("content", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest=new IndexRequest("student").id("1").source(builder);
文檔源作為對象提供,彈性搜索內置幫助器生成
JSON
內容XContentBuilder
IndexRequest indexRequest=new IndexRequest("student")
.id("1")
.source("id", 1,
"name", "admin",
"content", "trying out Elasticsearch");
作為密鑰對提供的文檔源,該源將轉換為 JSON 格式Object
request.routing("routing"); //<1>
<1> 路由值
request.timeout(TimeValue.timeValueSeconds(1)); //<1>
request.timeout("1s"); // <2>
<1> 超時以等待主分片 作為 TimeValue<2> 超時以等待主分片 作為 String
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL); //<1>
request.setRefreshPolicy("wait_for"); //<2>
<1> 將策略刷新 為實例
WriteRequest.RefreshPolicy
<2> 將策略刷新 為String
request.version(2);
版本
request.versionType(VersionType.EXTERNAL); //版本類型
版本類型
request.opType(DocWriteRequest.OpType.CREATE);//<1>
request.opType("create");//<2>
<1> 作為值提供的操作類型
DocWriteRequest.OpType
<2> 提供的操作類型可以是 或(默認)String
create
index
request.setPipeline("pipeline");
在索引文檔之前要執行的包含管道的名稱
IndexRequest
IndexResponse
IndexResponse indexResponse=client.index(request, RequestOptions.DEFAULT);
IOException
4xx 5xx ElasticsearchExceptionResponseException
IndexRequest
client.indexAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 執行完成時要執行和要使用的
IndexRequest
ActionListener
ActionListener
onResponse
onFailure
listener=new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
//<1> 成功執行時調用。
}
@Override
public void onFailure(Exception e) {
//<2> 當整個失敗時調用。IndexRequest
}
};
<1> 成功執行時調用。
<2> 當整個失敗時調用。> IndexRequest
IndexResponse
String index=indexResponse.getIndex();
String id=indexResponse.getId();
if (indexResponse.getResult()==DocWriteResponse.Result.CREATED) {
//<1>
} else if (indexResponse.getResult()==DocWriteResponse.Result.UPDATED) {
//<2>
}
ReplicationResponse.ShardInfo shardInfo=indexResponse.getShardInfo();
if (shardInfo.getTotal() !=shardInfo.getSuccessful()) {
// <3>
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure :
shardInfo.getFailures()) {
String reason=failure.reason(); //<4>
}
}
<1> 處理(如果需要)首次創建文檔的情況
<2> 處理(如果需要)文檔被重寫的情況,因為它已經存在
<3> 處理成功分片數少于總分片的情況
<4> 處理潛在的故障
ElasticsearchException
IndexRequest request=new IndexRequest("posts")
.id("1")
.source("field", "value")
.setIfSeqNo(10L)
.setIfPrimaryTerm(20);
try {
IndexResponse response=client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
if (e.status()==RestStatus.CONFLICT) {
//<1>
}
}
<1> 引發異常指示返回版本沖突錯誤
opTypecreate
IndexRequest request=new IndexRequest("posts")
.id("1")
.source("field", "value")
.opType(DocWriteRequest.OpType.CREATE);
try {
IndexResponse response=client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
if (e.status()==RestStatus.CONFLICT) {
//<1>
}
}
<1>引發異常指示返回版本沖突錯誤
private static void test01(){
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
GetRequest request=new GetRequest("student");
// 為特定字段 配置 源包含
String[] includs={"name","id","content"};
String[] excluds={"id"};
FetchSourceContext context=new FetchSourceContext(true,includs,excluds);
request.id("1").version(2).fetchSourceContext(context);
try {
GetResponse documentFields=client.get(request, RequestOptions.DEFAULT);
if (documentFields.isExists()) {
//檢索名稱
System.out.println(documentFields.getIndex());
// 獲取文檔源的 Map 結果
System.out.println(documentFields.getSource());
// 獲取源作為 Map
System.out.println(documentFields.getSourceAsMap());
// 獲取源作為 bytes
System.out.println(documentFields.getSourceAsBytes());
}else {
System.out.println("不錯在該數據");
}
} catch (IOException e) {
e.printStackTrace();
}
}
GetRequest getRequest=new GetRequest(
"posts", //<1>
"1"); //<1>
<1> 索引名稱
<2> 文檔 ID
request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
禁用源檢索,默認情況下啟用
String[] includes=new String[]{"message", "*Date"};
String[] excludes=Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext=new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
為特定字段 配置 源包含
includes
: 檢索結果所包含的字段excludes
: 檢索結果排除的字段
String[] includes=Strings.EMPTY_ARRAY;
String[] excludes=new String[]{"message"};
FetchSourceContext fetchSourceContext=new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
為特定字段配置源排除
request.storedFields("message");
GetResponse getResponse=client.get(request, RequestOptions.DEFAULT);
String message=getResponse.getField("message").getValue();
為特定存儲字段配置檢索(要求字段單獨存儲在映射中)
檢索存儲的字段(要求該字段單獨存儲在映射中)message
request.routing("routing");
路由值
request.preference("preference");
首選項值
request.realtime(false);
將實時標志設置為(默認情況下)falsetrue
request.refresh(true);
在檢索文檔之前執行刷新(默認情況下)false
request.version(2);
版本
request.versionType(VersionType.EXTERNAL);
版本類型
GetRequest
GetResponse
GetResponse getResponse=client.get(getRequest, RequestOptions.DEFAULT);
同步調用可能會引發 在高級 REST 客戶端中無法解析 REST 響應、請求會發出時間或類似情況下沒有從服務器返回的響應的情況下。IOException
在服務器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應正文錯誤詳細信息,然后引發泛型,并將原始代碼添加為抑制異常。4xx5xxElasticsearchExceptionResponseException
GetRequest
client.getAsync(request, RequestOptions.DEFAULT, listener);
執行完成時要執行和要使用的
GetRequest
ActionListener
異步方法不會阻止并立即返回。完成后,如果執行成功完成,則使用 方法調用 ,如果執行失敗,則使用 該方法。失敗方案和預期異常與同步執行案例相同。ActionListeneronResponseonFailure
典型的偵聽器如下所示: get
ActionListener<GetResponse> listener=new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getResponse) {
//成功執行時調用
}
@Override
public void onFailure(Exception e) {
//當整個失敗時調用。GetRequest
}
};
GetResponse
String index=getResponse.getIndex();
String id=getResponse.getId();
if (getResponse.isExists()) {
long version=getResponse.getVersion();
String sourceAsString=getResponse.getSourceAsString(); // <1>
Map<String, Object> sourceAsMap=getResponse.getSourceAsMap(); // <2>
byte[] sourceAsBytes=getResponse.getSourceAsBytes(); // <3>
} else {
// <4>
}
<1> 將文檔檢索為
String
<2> 將文檔檢索為Map<String, Object>
<3> 將文檔檢索為byte[]
<4> 處理找不到文檔的方案。請注意,盡管返回的響應具有狀態代碼,但返回的是有效的,而不是引發異常。此類響應不保存任何源文檔,其方法將返回。404 GetResponseisExistsfalse
404 ElasticsearchException
GetRequest request=new GetRequest("does_not_exist", "1");
try {
GetResponse getResponse=client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
if (e.status()==RestStatus.NOT_FOUND) {
//<1> 處理引發異常,因為索引不存在
}
}
<1> 處理引發異常,因為索引不存在
try {
GetRequest request=new GetRequest("posts", "1").version(2);
GetResponse getResponse=client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status()==RestStatus.CONFLICT) {
// <1>
}
}
<1> 引發異常指示返回版本沖突錯誤
其實很多 Api
的使用都是類似相同的,這里我們不再對其他 Api
進行解析,需要了解的完全可以去光網文檔查看,文檔地址在問上漲上面有。
本文由AnonyStar 發布,可轉載但需聲明原文出處。
仰慕「優雅編碼的藝術」 堅信熟能生巧,努力改變人生
歡迎關注微信公賬號 :云棲簡碼 獲取更多優質文章
更多文章關注筆者博客 :云棲簡碼
一、elasticsearch下載地址
1、官網:https://www.elastic.co/cn/
即刻體驗
Elasticsearch
2、直接解壓
三、進入bin目錄雙擊.bat文件直接啟動
3、報錯:error downloading geoip database [GeoLite2-City.mmdb],elasticsearch.yml中增加:
ingest.geoip.downloader.enabled: false
4、訪問地址http://localhost:9200/,無法訪問;改成https://localhost:9200/,需要輸入賬號密碼,改elasticsearch.yml
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
5、http://localhost:9200/訪問成功:
二、elasticsearch-head-master安裝
1、下載地址:https://github.com/mobz/elasticsearch-head
直接點zip
2、下載完成后直接解壓;
3、如果需要使用elasticsearch-head-master話需要安裝node.js,nideJS官網下載http://nodejs.cn/download/;
4、進入cmd命令窗口直接啟動,
npm install 安裝npm
npm run start 啟動
報錯:'grunt' is not recognized as an internal or external command, operable program or batch file.
解決:
全局安裝grunt-cli:npm install -g grunt-cli
使用它的目錄級別進行grunt:npm install grunt
安裝grunt
npm run start,運行;
運行
5、訪問http://localhost:9100/;
三、ElasticSearch安裝為Windows服務
1.elasticsearch的bin目錄下有一個elasticsearch-service.bat
2.cmd 進入bin目錄下執行: elasticsearch-service.bat install
3.查看電腦服務es已經存在了,啟動es服務執行:elasticsearch-service.bat start
Elasticsearch服務
elasticsearch-service.bat后面還可以執行這些命令
install: 安裝Elasticsearch服務
remove: 刪除已安裝的Elasticsearch服務(如果啟動則停止服務)
start: 啟動Elasticsearch服務(如果已安裝)
stop: 停止服務(如果啟動)
manager:啟動GUI來管理已安裝的服務