Elasticsearch
是基于 Lucene
開發(fā)的一個分布式全文檢索框架,向 Elasticsearch
中存儲和從 Elasticsearch
中查詢,格式是json。
向 Elasticsearch
中存儲數(shù)據(jù),其實(shí)就是向 es
中的 index
下面的 type
中存儲 json
類型的數(shù)據(jù)。
elasticsearch
提供了很多語言的客戶端用于操作 elasticsearch
服務(wù),例如: java
、 python
、 .net
、 JavaScript
、 PHP
等。本文主要介紹如何使用 java
語言來操作 elasticsearch
服務(wù)。在 elasticsearch
的官網(wǎng)上提供了兩種 java
語言的 API
,一種是 Java Transport Client
,一種是 Java REST Client
。
Java Transport Client
** 是基于 TCP 協(xié)議交互的,**在elasticsearch 7.0+
版本后官方不再贊成使用,在Elasticsearch 8.0的版本中完全移除TransportClient
**
Java REST Client
是基于 HTTP 協(xié)議交互,**而Java REST Client
又分為Java Low Level REST Client
和Java High Level REST Client
Java High Level REST Client
是在 Java Low Level REST Client
的基礎(chǔ)上做了封裝,使其以更加面向?qū)ο蠛筒僮鞲颖憷姆绞秸{(diào)用 elasticsearch
服務(wù)。官方推薦使用
Java High Level REST Client
,因?yàn)樵趯?shí)際使用中,Java Transport Client
在大并發(fā)的情況下會出現(xiàn)連接不穩(wěn)定的情況。那接下來我們就來看看elasticsearch
提供的Java High Level REST Client
(以下簡稱高級REST客戶端)的一些基礎(chǔ)的操作,跟多的操作大家自行閱讀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)
環(huán)境:
Windows 10
elasticsearch 7.91
IDEA
Maven
Java 8
高級客戶端需要
Java 1.8
并依賴于Elasticsearch core
項(xiàng)目
依賴:
<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();
在有關(guān) Java 高級客戶端的本文檔的其余部分中,實(shí)例將引用為 。
RestHighLevelClient
client
案例:
index
代碼:public static void main(String[] args) {
RestClientBuilder builder=RestClient.builder(
new HttpHost(
"127.0.0.1", //es主機(jī) IP
9200 // es 端口http
)
);
RestHighLevelClient client=new RestHighLevelClient(builder);
GetRequest request=new GetRequest(
"blog1", //索引
"1" //文檔ID
);
//當(dāng)針對不存在的索引執(zhí)行獲取請求時,響應(yīng)404狀態(tài)碼,將引發(fā)IOException,需要按如下方式處理:
GetResponse documentFields=null;
try {
documentFields=client.get(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
////處理因?yàn)樗饕淮嬖诙鴴伋龅漠惓G闆r
}
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
客戶端來訪問, 下面我們將進(jìn)行相關(guān)Api
的介紹
**
/*
* 創(chuàng)建索引.
* url:https://i-code.online/
*/
public static void main(String[] args) {
//創(chuàng)建鏈接信息
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//創(chuàng)建索引請求 索引名稱 student
CreateIndexRequest createIndexRequest=new CreateIndexRequest("student-1");
//創(chuàng)建索引時可以設(shè)置與之相關(guān)的 特定配置
createIndexRequest.settings(Settings.builder()
.put("index.number_of_shards",3) //分片數(shù)
.put("index.number_of_replicas",2) //備份數(shù)
);
//創(chuàng)建文檔類型映射
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字符串
);
//可選參數(shù)
//超時,等待所有節(jié)點(diǎn)被確認(rèn)(使用TimeValue方式)
createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));
try {
//同步執(zhí)行
CreateIndexResponse createIndexResponse=client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
//返回的CreateIndexResponse允許檢索有關(guān)執(zhí)行的操作的信息,如下所示:
boolean acknowledged=createIndexResponse.isAcknowledged();//指示是否所有節(jié)點(diǎn)都已確認(rèn)請求
boolean shardsAcknowledged=createIndexResponse.isShardsAcknowledged();//指示是否在超時之前為索引中的每個分片啟動了必需的分片副本數(shù)
System.out.println("acknowledged:"+acknowledged);
System.out.println("shardsAcknowledged:"+shardsAcknowledged);
System.out.println(createIndexResponse.index());
} catch (IOException e) {
e.printStackTrace();
}
try {
//關(guān)閉客戶端鏈接
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上述是一個 index 創(chuàng)建的過程,具體的細(xì)節(jié)操作
api
下面詳解
CreateIndexRequestindex
CreateIndexRequest request=new CreateIndexRequest("twitter");//<1>
<1>要創(chuàng)建索引
//此索引的設(shè)置
request.settings(Settings.builder()
.put("index.number_of_shards", 3) //分片數(shù)
.put("index.number_of_replicas", 2)//備份數(shù)
);
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的映射集合,自動轉(zhuǎn)為 json
提供自動轉(zhuǎn)換為
JSON
格式的映射源Map
這種方式多層嵌套,在使用過程中注意嵌套,上面標(biāo)簽嵌套:properties -> message -> type
XContentBuilder builder=XContentFactory.jsonBuilder(); // 使用XContentBuilder內(nèi)容生成器
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("message");
{
builder.field("type", "text");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
映射作為對象提供的源,彈性搜索內(nèi)置幫助器,用于生成
JSON
內(nèi)容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));
超時以等待所有節(jié)點(diǎn)將索引創(chuàng)建確認(rèn)為
TimeValue
request.setMasterTimeout(TimeValue.timeValueMinutes(1));
以作為
TimeValue
request.waitForActiveShards(ActiveShardCount.from(2));
request.waitForActiveShards(ActiveShardCount.DEFAULT);
在創(chuàng)建索引
API
返回響應(yīng)之前等待的活動分片副本數(shù),作為in
t在創(chuàng)建索引API
返回響應(yīng)之前等待的活動分片副本數(shù),作為ActiveShardCount
CreateIndexRequest CreateIndexResponse
CreateIndexResponse createIndexResponse=client.indices().create(request, RequestOptions.DEFAULT);
同步調(diào)用可能會引發(fā) 在高級 REST 客戶端中無法解析 REST 響應(yīng)、請求會發(fā)出時間或類似情況下沒有從服務(wù)器返回的響應(yīng)的情況下。
IOException
在服務(wù)器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應(yīng)正文錯誤詳細(xì)信息,然后引發(fā)泛型,并將原始代碼添加為抑制異常。4xx 5xx ElasticsearchExceptionResponseException
CreateIndexRequest
client.indices().createAsync(request, RequestOptions.DEFAULT, listener);
執(zhí)行完成時要執(zhí)行和要使用的
CreateIndexRequest ActionListener
onResponse
方法調(diào)用 ,如果執(zhí)行失敗,則使用 onFailure
該方法。失敗方案和預(yù)期異常與同步執(zhí)行案例相同。 ActionListener
ActionListener<CreateIndexResponse> listener=new ActionListener<CreateIndexResponse>() {
@Override
public void onResponse(CreateIndexResponse createIndexResponse) {
//成功執(zhí)行時調(diào)用。
}
@Override
public void onFailure(Exception e) {
//當(dāng)整個失敗時調(diào)用
}
};
CreateIndexResponse
boolean acknowledged=createIndexResponse.isAcknowledged(); // <1>
boolean shardsAcknowledged=createIndexResponse.isShardsAcknowledged(); // <2>
<1> 指示所有節(jié)點(diǎn)是否都已確認(rèn)請求
<2> 指示在計(jì)時之前是否為索引中的每個分片啟動所需的分片副本數(shù)
/**
* 刪除索引.
* url:https://i-code.online/
* @param args
*/
public static void main(String[] args) {
//1. 創(chuàng)建客戶端
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//2. 創(chuàng)建DeleteIndexRequest 接受 index(索引名) 參數(shù)
DeleteIndexRequest request=new DeleteIndexRequest("student");
//超時以等待所有節(jié)點(diǎn)確認(rèn)索引刪除 參數(shù)為 TimeValue 類型
request.timeout(TimeValue.timeValueMinutes(1));
//連接master節(jié)點(diǎn)的超時時間(使用TimeValue方式)
request.masterNodeTimeout(TimeValue.timeValueMinutes(1));
try {
// 調(diào)用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");
超時以等待所有節(jié)點(diǎn)確認(rèn)索引刪除為
TimeValue
類型
超時以等待所有節(jié)點(diǎn)確認(rèn)索引刪除為
String
類型
request.masterNodeTimeout(TimeValue.timeValueMinutes(1));//連接master節(jié)點(diǎn)的超時時間(使用TimeValue方式)
request.masterNodeTimeout("1m");//連接master節(jié)點(diǎn)的超時時間(使用字符串方式)
連接master節(jié)點(diǎn)的超時時間(使用TimeValue方式)連接master節(jié)點(diǎn)的超時時間(使用字符串方式)
request.indicesOptions(IndicesOptions.lenientExpandOpen());
設(shè)置控制如何解析不可用的索引以及如何展開通配符表達(dá)式IndicesOptions
DeleteIndexRequest
時,客戶端將等待 DeleteIndexResponse
返回 ,然后再繼續(xù)執(zhí)行代碼: DeleteIndexRequest
DeleteIndexResponse
AcknowledgedResponse deleteIndexResponse=client.indices().delete(request, RequestOptions.DEFAULT);
同步調(diào)用可能會引發(fā) 在高級
REST
客戶端中無法解析REST
響應(yīng)、請求會發(fā)出時間或類似情況下沒有從服務(wù)器返回的響應(yīng)的情況下。IOException
在服務(wù)器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應(yīng)正文錯誤詳細(xì)信息,然后引發(fā)泛型,并將原始代碼添加為抑制異常。4xx 5xx ElasticsearchExceptionResponseException
DeleteIndexRequest
client.indices().deleteAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 執(zhí)行完成時要執(zhí)行和要使用的DeleteIndexRequest ActionListener
異步方法不會阻止并立即返回。完成后,如果執(zhí)行成功完成,則使用 ActionListener#onResponse
方法調(diào)用 ,如果執(zhí)行失敗,則使用 ActionListener#
onFailure
該方法。失敗方案和預(yù)期異常與同步執(zhí)行案例相同。
典型的偵聽器如下所示:delete-index
ActionListener<AcknowledgedResponse> listener=new ActionListener<AcknowledgedResponse>() {
@Override
public void onResponse(AcknowledgedResponse deleteIndexResponse) {
//成功執(zhí)行時調(diào)用。
}
@Override
public void onFailure(Exception e) {
//當(dāng)整個失敗時調(diào)用。DeleteIndexRequest
}
};
DeleteIndexResponse
boolean acknowledged=deleteIndexResponse.isAcknowledged(); //<1> 指示所有節(jié)點(diǎn)是否都已確認(rèn)請求
<1> 指示所有節(jié)點(diǎn)是否都已確認(rèn)請求
ElasticsearchException
try {
DeleteIndexRequest request=new DeleteIndexRequest("does_not_exist");
client.indices().delete(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status()==RestStatus.NOT_FOUND) {
//如果未找到要刪除的索引,則進(jìn)行""
}
}
如果未找到要刪除的索引,則進(jìn)行""
/**
* 索引是否存在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)));
//創(chuàng)建請求
GetIndexRequest request=new GetIndexRequest("student");
//<1> 是返回本地信息還是從主節(jié)點(diǎn)檢索狀態(tài)
request.local(false);
//<2> 返回結(jié)果為適合人類的格式
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> 是返回本地信息還是從主節(jié)點(diǎn)檢索狀態(tài)
request.humanReadable(true); //<2> 返回結(jié)果為適合人類的格式
request.includeDefaults(false); //<3> 是否返回每個索引的所有默認(rèn)設(shè)置
request.indicesOptions(indicesOptions); //<4> 控制如何解析不可用的索引以及如何展開通配符表達(dá)式
<1> 是返回本地信息還是從主節(jié)點(diǎn)檢索狀態(tài)<2> 返回結(jié)果為適合人類的格式<3> 是否返回每個索引的所有默認(rèn)設(shè)置<4> 控制如何解析不可用的索引以及如何展開通配符表達(dá)式
GetIndexRequest
boolean
boolean exists=client.indices().exists(request, RequestOptions.DEFAULT);
與其他同步的相同
-
GetIndexRequest
client.indices().existsAsync(request, RequestOptions.DEFAULT, listener);//<1>執(zhí)行完成時要執(zhí)行和要使用的 GetIndexRequest ActionListener
<1>執(zhí)行完成時要執(zhí)行和要使用的
GetIndexRequest
ActionListener
異步的處理邏輯與其他異步的相同,都是實(shí)現(xiàn)ActionListener
的方法
boolean
private static void test02() {
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//創(chuàng)建請求, 參數(shù)index名稱
IndexRequest request=new IndexRequest("student");
//請求的模式,CREATE: 創(chuàng)建模式,如果已經(jīng)存在則報(bào)錯 Index:存在則不再創(chuàng)建,也不報(bào)錯
request.opType(DocWriteRequest.OpType.INDEX);
String json="{\n" +
" \"id\": 12,\n" +
" \"name\": \"admin\",\n" +
" \"content\": \"步的處理邏輯與其他異步的相同,都是實(shí)現(xiàn)ActionListener 的方法\"\n" +
"}";
request.id("1").source(
json,
XContentType.JSON
);
IndexResponse indexResponse=null;
try {
//調(diào)用 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
//創(chuàng)建請求, 參數(shù)index名稱
IndexRequest request=new IndexRequest("student"); //<1> index 名稱
String json="{\n" +
" \"id\": 12,\n" +
" \"name\": \"admin\",\n" +
" \"content\": \"步的處理邏輯與其他異步的相同,都是實(shí)現(xiàn)ActionListener 的方法\"\n" +
"}";
request
.id("1") // <2> 指定文檔 ID
.source(
json,
XContentType.JSON // <3> 指定參數(shù)類型,json
);
<1> index 名稱指數(shù)
<2> 請求的文檔 ID
<3> 指定參數(shù)類型,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);
文檔源作為 自動轉(zhuǎn)換為
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);
文檔源作為對象提供,彈性搜索內(nèi)置幫助器生成
JSON
內(nèi)容XContentBuilder
IndexRequest indexRequest=new IndexRequest("student")
.id("1")
.source("id", 1,
"name", "admin",
"content", "trying out Elasticsearch");
作為密鑰對提供的文檔源,該源將轉(zhuǎn)換為 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> 將策略刷新 為實(shí)例
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> 提供的操作類型可以是 或(默認(rèn))String
create
index
request.setPipeline("pipeline");
在索引文檔之前要執(zhí)行的包含管道的名稱
IndexRequest
IndexResponse
IndexResponse indexResponse=client.index(request, RequestOptions.DEFAULT);
IOException
4xx 5xx ElasticsearchExceptionResponseException
IndexRequest
client.indexAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 執(zhí)行完成時要執(zhí)行和要使用的
IndexRequest
ActionListener
ActionListener
onResponse
onFailure
listener=new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
//<1> 成功執(zhí)行時調(diào)用。
}
@Override
public void onFailure(Exception e) {
//<2> 當(dāng)整個失敗時調(diào)用。IndexRequest
}
};
<1> 成功執(zhí)行時調(diào)用。
<2> 當(dāng)整個失敗時調(diào)用。> 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> 處理(如果需要)首次創(chuàng)建文檔的情況
<2> 處理(如果需要)文檔被重寫的情況,因?yàn)樗呀?jīng)存在
<3> 處理成功分片數(shù)少于總分片的情況
<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> 引發(fā)異常指示返回版本沖突錯誤
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>引發(fā)異常指示返回版本沖突錯誤
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 結(jié)果
System.out.println(documentFields.getSource());
// 獲取源作為 Map
System.out.println(documentFields.getSourceAsMap());
// 獲取源作為 bytes
System.out.println(documentFields.getSourceAsBytes());
}else {
System.out.println("不錯在該數(shù)據(jù)");
}
} catch (IOException e) {
e.printStackTrace();
}
}
GetRequest getRequest=new GetRequest(
"posts", //<1>
"1"); //<1>
<1> 索引名稱
<2> 文檔 ID
request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
禁用源檢索,默認(rèn)情況下啟用
String[] includes=new String[]{"message", "*Date"};
String[] excludes=Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext=new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
為特定字段 配置 源包含
includes
: 檢索結(jié)果所包含的字段excludes
: 檢索結(jié)果排除的字段
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();
為特定存儲字段配置檢索(要求字段單獨(dú)存儲在映射中)
檢索存儲的字段(要求該字段單獨(dú)存儲在映射中)message
request.routing("routing");
路由值
request.preference("preference");
首選項(xiàng)值
request.realtime(false);
將實(shí)時標(biāo)志設(shè)置為(默認(rèn)情況下)falsetrue
request.refresh(true);
在檢索文檔之前執(zhí)行刷新(默認(rèn)情況下)false
request.version(2);
版本
request.versionType(VersionType.EXTERNAL);
版本類型
GetRequest
GetResponse
GetResponse getResponse=client.get(getRequest, RequestOptions.DEFAULT);
同步調(diào)用可能會引發(fā) 在高級 REST 客戶端中無法解析 REST 響應(yīng)、請求會發(fā)出時間或類似情況下沒有從服務(wù)器返回的響應(yīng)的情況下。IOException
在服務(wù)器返回 或 錯誤代碼的情況下,高級客戶端嘗試分析響應(yīng)正文錯誤詳細(xì)信息,然后引發(fā)泛型,并將原始代碼添加為抑制異常。4xx5xxElasticsearchExceptionResponseException
GetRequest
client.getAsync(request, RequestOptions.DEFAULT, listener);
執(zhí)行完成時要執(zhí)行和要使用的
GetRequest
ActionListener
異步方法不會阻止并立即返回。完成后,如果執(zhí)行成功完成,則使用 方法調(diào)用 ,如果執(zhí)行失敗,則使用 該方法。失敗方案和預(yù)期異常與同步執(zhí)行案例相同。ActionListeneronResponseonFailure
典型的偵聽器如下所示: get
ActionListener<GetResponse> listener=new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getResponse) {
//成功執(zhí)行時調(diào)用
}
@Override
public void onFailure(Exception e) {
//當(dāng)整個失敗時調(diào)用。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> 處理找不到文檔的方案。請注意,盡管返回的響應(yīng)具有狀態(tài)代碼,但返回的是有效的,而不是引發(fā)異常。此類響應(yīng)不保存任何源文檔,其方法將返回。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> 處理引發(fā)異常,因?yàn)樗饕淮嬖?
}
}
<1> 處理引發(fā)異常,因?yàn)樗饕淮嬖?/p>
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> 引發(fā)異常指示返回版本沖突錯誤
其實(shí)很多 Api
的使用都是類似相同的,這里我們不再對其他 Api
進(jìn)行解析,需要了解的完全可以去光網(wǎng)文檔查看,文檔地址在問上漲上面有。
本文由AnonyStar 發(fā)布,可轉(zhuǎn)載但需聲明原文出處。
仰慕「優(yōu)雅編碼的藝術(shù)」 堅(jiān)信熟能生巧,努力改變?nèi)松?br>歡迎關(guān)注微信公賬號 :云棲簡碼 獲取更多優(yōu)質(zhì)文章
更多文章關(guān)注筆者博客 :云棲簡碼
一、elasticsearch下載地址
1、官網(wǎng):https://www.elastic.co/cn/
即刻體驗(yàn)
Elasticsearch
2、直接解壓
三、進(jìn)入bin目錄雙擊.bat文件直接啟動
3、報(bào)錯: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
直接點(diǎn)zip
2、下載完成后直接解壓;
3、如果需要使用elasticsearch-head-master話需要安裝node.js,nideJS官網(wǎng)下載http://nodejs.cn/download/;
4、進(jìn)入cmd命令窗口直接啟動,
npm install 安裝npm
npm run start 啟動
報(bào)錯:'grunt' is not recognized as an internal or external command, operable program or batch file.
解決:
全局安裝grunt-cli:npm install -g grunt-cli
使用它的目錄級別進(jìn)行g(shù)runt:npm install grunt
安裝grunt
npm run start,運(yùn)行;
運(yùn)行
5、訪問http://localhost:9100/;
三、ElasticSearch安裝為Windows服務(wù)
1.elasticsearch的bin目錄下有一個elasticsearch-service.bat
2.cmd 進(jìn)入bin目錄下執(zhí)行: elasticsearch-service.bat install
3.查看電腦服務(wù)es已經(jīng)存在了,啟動es服務(wù)執(zhí)行:elasticsearch-service.bat start
Elasticsearch服務(wù)
elasticsearch-service.bat后面還可以執(zhí)行這些命令
install: 安裝Elasticsearch服務(wù)
remove: 刪除已安裝的Elasticsearch服務(wù)(如果啟動則停止服務(wù))
start: 啟動Elasticsearch服務(wù)(如果已安裝)
stop: 停止服務(wù)(如果啟動)
manager:啟動GUI來管理已安裝的服務(wù)