Elasticsearch 保姆級入門篇
Elasticsearch 是一個分布式的、面向生產(chǎn)規(guī)模工作負(fù)載優(yōu)化的搜索引擎。
Kibana 可以將 Elasticsearch 中的數(shù)據(jù)轉(zhuǎn)化為直觀的圖表、圖形和儀表盤。
這篇文章,您將學(xué)習(xí)本地安裝 Elasticsearch 和 Kibana,以及使用開發(fā)工具/ Java SDK 創(chuàng)建索引和搜索數(shù)據(jù)。
1 本地安裝
1.1 創(chuàng)建網(wǎng)絡(luò)
我們需要創(chuàng)建一個供 Elasticsearch 和 Kibana 使用的 network。這個 network 將被用于 Elasticsearch 和 Kibana 之間的通信。
docker network create elastic
1.2 安裝 ES
拉取 Elasticsearch 鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:{version}
這里的版本 version ,我們選?。?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(234, 84, 41);">8.9.0 。
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.9.0
啟動 docker elasticsearch 鏡像
docker run --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -t docker.elastic.co/elasticsearch/elasticsearch:8.9.0
進(jìn)入ES容器,修改 elasticsearch 用戶密碼
bin/elasticsearch-reset-password --username elastic -i
1.3 安裝 Kibana
拉取 Kibana 鏡像
docker pull docker.elastic.co/kibana/kibana:8.9.0
啟動 Kibana 鏡像
docker run --name kibana --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.9.0
因為啟動安裝 Kibana ,需要 token , 所以進(jìn)入 elasticsearch 容器 ,執(zhí)行:
bin/elasticsearch-create-enrollment-token -s kibana
輸入 token 之后,刷新頁面,進(jìn)入登錄頁面:
2 接口測試
我們可以使用 Kibana Dev tools 來進(jìn)行接口測試。
2.1 添加
向索引添加單個文檔,提交一個 HTTP POST 請求,目標(biāo)是該索引。
POST /customer/_doc/1
{
"firstname": "Jennifer",
"lastname": "Walters"
}
該請求會自動創(chuàng)建名為customer的索引(如果不存在),然后添加一個 ID 為 1的新文檔,同時存儲并建立firstname和lastname字段的索引。
新文檔可以立即從集群中的任何節(jié)點獲取。您可以使用 GET 請求來檢索它,請求中需指定其文檔 ID :
GET /customer/_doc/1
要一次性添加多個文檔,請使用 _bulk API。批量數(shù)據(jù)必須是以換行分隔的 JSON(NDJSON)格式。每一行必須以換行字符(\n)結(jié)尾,包括最后一行。
PUT customer/_bulk
{ "create": { } }
{ "firstname": "Monica","lastname":"Rambeau"}
{ "create": { } }
{ "firstname": "Carol","lastname":"Danvers"}
{ "create": { } }
{ "firstname": "Wanda","lastname":"Maximoff"}
{ "create": { } }
{ "firstname": "Jennifer","lastname":"Takeda"}
2.2 搜索
已索引的文檔可以在準(zhǔn)實時的情況下進(jìn)行搜索。下面的搜索將在customer索引中匹配所有名為 Jennifer 的顧客。
GET customer/_search
{
"query" : {
"match" : { "firstname": "Jennifer" }
}
}
2.3 視圖
進(jìn)入 Kibana Data Views :
然后創(chuàng)建數(shù)據(jù)視圖 :
創(chuàng)建數(shù)據(jù)視圖之后,可以在 Analytics > Discover 查看索引數(shù)據(jù)。
3 Java SDK 實戰(zhàn)
3.1 依賴
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.9.0</version>
</dependency>
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart</artifactId>
<version>7.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
<!-- 強(qiáng)制走高版本 ,防止和springboot 依賴沖突 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>8.9.0</version>
</dependency>
3.2 創(chuàng)建客戶端
1、通過用戶名和密碼創(chuàng)建客戶端
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https"));
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "ilxw@19841201"));
// Elasticsearch 提供了 Https 服務(wù),創(chuàng)建 client 建立 SSL 鏈接時沒有做證書驗證 ;
SSLFactory sslFactory = SSLFactory.builder().withUnsafeTrustMaterial().withUnsafeHostnameVerifier().build();
builder = builder.setHttpClientConfigCallback(
httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
setSSLContext(sslFactory.getSslContext())
.setSSLHostnameVerifier(sslFactory.getHostnameVerifier())
);
RestClient restClient = builder.build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient esClient = new ElasticsearchClient(transport);
2、通過 apikey 創(chuàng)建客戶端
我們在安全目錄的管理頁面,創(chuàng)建 API key ,如下圖:
示例代碼如下:
// 自己創(chuàng)建的 apikey
String apiKey = "cnRVUy1Ja0JZYUtuSTRuMG1oRkk6RVFSdTk2T2NRb1cyYVdLRTB4TjktQQ==";
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https"));
SSLFactory sslFactory = SSLFactory.builder().withUnsafeTrustMaterial().withUnsafeHostnameVerifier().build();
RestClient restClient = builder.setDefaultHeaders(new Header[]{new BasicHeader("Authorization", "ApiKey " + apiKey)}).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setSSLContext(sslFactory.getSslContext()).setSSLHostnameVerifier(sslFactory.getHostnameVerifier())).build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient esClient = new ElasticsearchClient(transport);
3.3 創(chuàng)建文檔
創(chuàng)建索引名為 products ,新建一個文檔 id 為 1 。
ProductPo product = new ProductPo(1, "Bag", 42);
IndexRequest<Object> indexRequest = new IndexRequest.Builder<>().index("products").id(String.valueOf(product.getId())).document(product).build();
IndexResponse response = esClient.index(indexRequest);
System.out.println("Indexed with version " + response.version());
3.4 查詢文檔
GetResponse<ProductPo> response = esClient.get(g -> g
.index("products")
.id(String.valueOf(1)),
ProductPo.class
);
if (response.found()) {
ProductPo product = response.source();
System.out.println("Product name " + product.getName());
} else {
System.out.println("Product not found");
}
3.5 修改文檔
Map<String, Object> doc = new HashMap<String, Object>();
// 文檔產(chǎn)品名稱調(diào)整為 my bike
doc.put("name", "my bike");
doc.put("price", 100);
BulkOperation op = new BulkOperation.Builder().update(
i -> i.action(new UpdateAction.Builder<>().doc(doc).docAsUpsert(true).build()).id("1"))
.build();
List<BulkOperation> list = Collections.singletonList(op);
BulkResponse response = esClient.bulk(bulkBuilder -> bulkBuilder.index("products").operations(list));
3.6 刪除文檔
esClient.delete(d -> d.index("products").id("1"));
參考文檔:
1、Elasticsearch 官方文檔:
https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html
2、Github文檔
https://github.com/elastic/elasticsearch
