網(wǎng)站好友邀請鏈接生成 php酒店如何進(jìn)行網(wǎng)絡(luò)營銷
🚀 Elasticsearch 雙劍合璧:HTTP API 與 Java API 實戰(zhàn)整合指南
一、HTTP API
定義與用途
Elasticsearch 的 HTTP API 是基于 RESTful 接口設(shè)計的核心交互方式,支持通過 URL 和 JSON 數(shù)據(jù)直接操作索引、文檔、集群等資源。適用于快速調(diào)試、腳本調(diào)用和跨語言集成。
1. 索引管理
(1) 創(chuàng)建索引(指定分片與映射)
PUT /products
{"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"name": { "type": "text" },"price": { "type": "integer" }}}
}
- 用途:初始化數(shù)據(jù)結(jié)構(gòu),定義字段類型和分片策略。
- 參數(shù)說明:
number_of_shards
:主分片數(shù)(不可修改)。mappings
:字段類型(如text
支持分詞,keyword
精確匹配)。
product
:只是一個代表,是你要創(chuàng)建的索引的名稱,索引可以理解為mysql中的一個表
settings
:配置
properties
:其內(nèi)容就是你要寫入到es的對象具體內(nèi)容
(2) 刪除索引
DELETE /products
- 風(fēng)險提示:刪除索引會清空所有數(shù)據(jù),需謹(jǐn)慎操作。
2. 文檔操作
(1) 新增文檔(自動生成 ID)
POST /products/_doc
{"name": "iPhone 14","price": 6999
}
- 響應(yīng)示例:返回自動生成的
_id
(如_id: "x123"
)。
如上,請求體給出具體寫到文檔中的內(nèi)容,文檔可以理解為mysql中的一行數(shù)據(jù)記錄
(2) 局部更新文檔
POST /products/_update/x123
{"doc": { "price": 6499 }
}
- 優(yōu)勢:僅更新指定字段,減少網(wǎng)絡(luò)傳輸和索引重建開銷。
3. 查詢與聚合
(1) 條件查詢(分頁與排序)
GET /products/_search
{"query": {"match": { "name": "iPhone" }},"from": 0,"size": 10,"sort": [ { "price": "desc" } ]
}
- 性能注意:深度分頁(
from > 10000
)需改用Search After
或Scroll API
。
from
和size
用于分頁,from表示從第n個數(shù)據(jù)開始,size表示返回這個開始數(shù)據(jù)算起的m條文檔數(shù)據(jù)
sort
表示按照什么字段排序,升序還是降序
(2) 聚合統(tǒng)計(平均值)
GET /products/_search
{"aggs": {"avg_price": { "avg": { "field": "price" } }}
}
- 結(jié)果路徑:
aggregations -> avg_price -> value
。
4. 批量操作
(1) 批量寫入/刪除
POST /_bulk
{ "index": { "_index": "products", "_id": "1" } }
{ "name": "iPad", "price": 3999 }
{ "delete": { "_index": "products", "_id": "2" } }
- 性能建議:單次批量操作不超過 10MB,避免超時。
二、Java API
定義與用途
Java API 是 Elasticsearch 官方提供的高層客戶端庫(RestHighLevelClient
),封裝了 HTTP 請求的復(fù)雜性,支持強(qiáng)類型操作和異步處理。適用于后端服務(wù)開發(fā)。
1. RestHighLevelClient 常用方法
定義與用途
RestHighLevelClient
是 Java 客戶端的入口類,通過調(diào)用其方法執(zhí)行索引、文檔、搜索等操作。需注意在 Elasticsearch 8.x 中已逐步遷移至新客戶端 ElasticsearchClient
,但舊版仍廣泛使用。
(1) 索引管理方法
方法簽名 | 用途 | 對應(yīng) Request 類 |
---|---|---|
indices().create() | 創(chuàng)建索引 | CreateIndexRequest |
indices().delete() | 刪除索引 | DeleteIndexRequest |
indices().exists() | 檢查索引是否存在 | GetIndexRequest |
示例:創(chuàng)建索引
CreateIndexRequest request = new CreateIndexRequest("products").settings(Settings.builder().put("number_of_shards", 3)).mapping(Map.of("properties", Map.of("name", Map.of("type", "text"))));
client.indices().create(request, RequestOptions.DEFAULT);
(2) 文檔操作方法
方法簽名 | 用途 | 對應(yīng) Request 類 |
---|---|---|
index() | 新增/全量替換文檔 | IndexRequest |
update() | 局部更新文檔 | UpdateRequest |
delete() | 刪除文檔 | DeleteRequest |
示例:局部更新文檔
UpdateRequest request = new UpdateRequest("products", "x123").doc(Map.of("price", 6499));
client.update(request, RequestOptions.DEFAULT);
(3) 查詢與聚合方法
方法簽名 | 用途 | 對應(yīng) Request 類 |
---|---|---|
search() | 執(zhí)行搜索 | SearchRequest |
scroll() | 滾動查詢大數(shù)據(jù)量 | SearchScrollRequest |
示例:條件查詢
SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "iPhone")).size(10);
SearchRequest request = new SearchRequest("products").source(source);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
2. Request 與 Builder 常用方法
定義與用途
每個操作對應(yīng)一個 Request
類,通過 Builder 模式鏈?zhǔn)皆O(shè)置參數(shù)(如查詢條件、分頁、聚合等)。新版客戶端(8.x)推薦使用流式語法(Lambda 表達(dá)式),舊版通過 XxxRequestBuilder
類構(gòu)建。
(1) SearchRequest
與 SearchSourceBuilder
用途:構(gòu)建復(fù)雜查詢(分頁、排序、聚合)。
- Request 方法
indices(String... indices)
:指定搜索的索引。source(SearchSourceBuilder source)
:綁定查詢條件、分頁、排序等。
- Builder 方法
query(QueryBuilder query)
:設(shè)置查詢條件(如matchQuery
)。aggregation(AggregationBuilder aggregation)
:添加聚合邏輯(如avg
)。from(int).size(int)
:分頁控制
對于
QueryBuilders
的詳細(xì)介紹,看這篇文章
玩轉(zhuǎn)Elasticsearch 查詢利器!QueryBuilders 核心方法全解析-CSDN博客
核心方法:
SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "iPhone")).filter(QueryBuilders.rangeQuery("price").gte(5000))).aggregation(AggregationBuilders.avg("avg_price").field("price")).from(0).size(10);
SearchRequest request = new SearchRequest("products").source(source);
(2) BulkRequest
(批量操作)
用途:混合執(zhí)行增刪改操作。
- Request 方法
add(IndexRequest/UpdateRequest/DeleteRequest)
:混合添加增刪改操作。
- Builder 方法
setRefreshPolicy(WriteRequest.RefreshPolicy)
:設(shè)置刷新策略(如IMMEDIATE
實時生效)。
示例:
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new IndexRequest("products").id("1").source("name", "iPad"));
bulkRequest.add(new DeleteRequest("products").id("2"));
client.bulk(bulkRequest, RequestOptions.DEFAULT);
(3) UpdateByQueryRequest
(按條件更新)
用途:批量更新符合查詢條件的文檔。
- Request 方法
setQuery(QueryBuilder query)
:篩選目標(biāo)文檔。setScript(Script script)
:定義更新邏輯。
示例:
UpdateByQueryRequest request = new UpdateByQueryRequest("products");
request.setQuery(QueryBuilders.termQuery("status", "pending"));
request.setScript(new Script("ctx._source.status = 'processed'"));
client.updateByQuery(request, RequestOptions.DEFAULT);
3. 整合示例:Request 與 Builder 協(xié)作
場景:構(gòu)建復(fù)雜查詢(分頁 + 聚合 + 高亮)
// 1. 構(gòu)建查詢條件
SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "iPhone")).filter(QueryBuilders.rangeQuery("price").gte(5000))).aggregation(AggregationBuilders.avg("avg_price").field("price")).highlighter(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>")).from(0).size(10);// 2. 創(chuàng)建 Request 對象
SearchRequest request = new SearchRequest("products").source(source).indices("products", "sales"); // 跨索引查詢// 3. 執(zhí)行查詢
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- 關(guān)鍵點:
SearchSourceBuilder
負(fù)責(zé)組裝查詢邏輯。SearchRequest
綁定查詢條件并指定索引范圍
三、最佳實踐
-
性能優(yōu)化
- 使用
BulkProcessor
自動分批次提交文檔。 - 設(shè)置
setRefreshPolicy(WriteRequest.RefreshPolicy.NONE)
減少實時刷新開銷。
- 使用
-
錯誤處理
try {client.index(request, RequestOptions.DEFAULT); } catch (ElasticsearchException e) {if (e.status() == RestStatus.CONFLICT) {// 處理版本沖突} }
-
版本遷移
- Elasticsearch 8.x 推薦使用新客戶端
ElasticsearchClient
,語法更簡潔:client.search(s -> s.index("products").query(q -> q.match(m -> m.field("name").query("iPhone"))) , Product.class);
- Elasticsearch 8.x 推薦使用新客戶端