一、Elasticsearch——使用Java API實(shí)現(xiàn)ES中的索引、映射、文檔操作
1.1 簡(jiǎn)單介紹
之前是對(duì)ES中的創(chuàng)建/查看/刪除索引、創(chuàng)建定義映射、創(chuàng)建/查看/修改/刪除文檔的這些操作有了一定的了解認(rèn)識(shí),但是是通過Postman + JSON串的方法來實(shí)現(xiàn)的
那么之后仍然是對(duì)ES中的索引、映射、文檔進(jìn)行操作,只是方法換成了Java API。
1.2 案例詳情
首先需要?jiǎng)?chuàng)建一個(gè)maven工程,必然要添加ES相關(guān)的依賴。
同時(shí)雙擊ES安裝目錄的bin目錄下的 elasticsearch.bat ,先啟動(dòng)ES服務(wù)端。
- pom文件
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
<!-- elasticsearch 的客戶端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
<!-- elasticsearch 依賴 2.x 的 log4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<!-- junit 單元測(cè)試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
1.2.1 創(chuàng)建ES客戶端:完成與ES服務(wù)端連接
后邊都是按照這個(gè)模板代碼來的
package com.szh.es;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;
/**
*
*/
public class ESTestClient {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.2 創(chuàng)建索引
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//創(chuàng)建索引 --- 請(qǐng)求對(duì)象
CreateIndexRequest request = new CreateIndexRequest("user");
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
//響應(yīng)狀態(tài)
boolean acknowledged = response.isAcknowledged();
System.out.println("索引操作:" + acknowledged);
//關(guān)閉ES客戶端
esClient.close();
1.2.3 查看索引
public class ESTestIndexSearch {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//查詢索引 --- 請(qǐng)求對(duì)象
GetIndexRequest request = new GetIndexRequest("user");
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
//響應(yīng)狀態(tài)
System.out.println(response.getAliases());
System.out.println(response.getMappings());
System.out.println(response.getSettings());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.4 刪除索引
public class ESTestIndexDelete {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//刪除索引 --- 請(qǐng)求對(duì)象
DeleteIndexRequest request = new DeleteIndexRequest("user");
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
AcknowledgedResponse response = esClient.indices().delete(request,RequestOptions.DEFAULT);
//響應(yīng)狀態(tài)
System.out.println(response.isAcknowledged());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.5 創(chuàng)建文檔
索引有了,就相當(dāng)于有了數(shù)據(jù)庫。接下來就需要向數(shù)據(jù)庫中建表、添加數(shù)據(jù)。建表自然要有表結(jié)構(gòu)(有哪些屬性、這些屬性分別都是什么數(shù)據(jù)類型),也就是ES中的映射,在Java代碼中就可以采用實(shí)體類來實(shí)現(xiàn)。
public class User {
private String name;
private String sex;
private Integer age;
//getter and setter
}
public class ESTestDocInsert {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//創(chuàng)建文檔 --- 請(qǐng)求對(duì)象
IndexRequest request = new IndexRequest();
//設(shè)置索引及索引中文檔的唯一性標(biāo)識(shí)id(如果不指定,則ES會(huì)默認(rèn)隨機(jī)生成一個(gè)id)
request.index("user").id("1001");
//創(chuàng)建數(shù)據(jù)對(duì)象(文檔內(nèi)容)
User user = new User();
user.setName("張起靈");
user.setSex("man");
user.setAge(21);
//向ES中插入數(shù)據(jù),必須將數(shù)據(jù)格式轉(zhuǎn)換為JSON
ObjectMapper objectMapper = new ObjectMapper();
String userJson = objectMapper.writeValueAsString(user);
request.source(userJson, XContentType.JSON);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.getResult());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.6 修改文檔
public class ESTestDocUpdate {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//修改文檔 --- 請(qǐng)求對(duì)象
UpdateRequest request = new UpdateRequest();
//配置修改參數(shù) --- 表示要修改user索引中id為1001的文檔內(nèi)容
request.index("user").id("1001");
//將修改后的內(nèi)容,以JSON格式寫入請(qǐng)求體中
request.doc(XContentType.JSON,"age",18);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
UpdateResponse response = esClient.update(request,RequestOptions.DEFAULT);
System.out.println(response.getResult());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.7 查看文檔
public class ESTestDocSearch {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//查詢文檔 --- 請(qǐng)求對(duì)象
GetRequest request = new GetRequest();
//設(shè)置請(qǐng)求參數(shù) --- 表示要查詢user索引中id為1001的文檔內(nèi)容
request.index("user").id("1001");
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
GetResponse response = esClient.get(request,RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.8 刪除文檔
public class ESTestDocDelete {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//刪除文檔 --- 請(qǐng)求對(duì)象
DeleteRequest request = new DeleteRequest();
//設(shè)置請(qǐng)求參數(shù) --- 表示要?jiǎng)h除user索引中id為1001的文檔
request.index("user").id("1001");
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
DeleteResponse response = esClient.delete(request,RequestOptions.DEFAULT);
System.out.println(response.getResult());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.9 批量創(chuàng)建文檔
public class ESTestDocInsertBatch {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//批量新增文檔 --- 請(qǐng)求對(duì)象
BulkRequest request = new BulkRequest();
//以JSON格式批量新增文檔 --- 存入請(qǐng)求體中
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "張起靈","sex","boy","age",21));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "小哥","sex","boy","age",18));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "小宋","sex","boy","age",20));
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.10 批量刪除文檔
public class ESTestDocDeleteBatch {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//批量刪除文檔 --- 請(qǐng)求對(duì)象
BulkRequest request = new BulkRequest();
//將要?jiǎng)h除的文檔id存入請(qǐng)求體中
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
BulkResponse response = esClient.bulk(request,RequestOptions.DEFAULT);
System.out.println(response.getTook());
System.out.println(response.getItems());
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.11 全量查詢
因?yàn)樯厦鎯蓚€(gè)代碼案例分別進(jìn)行了批量創(chuàng)建、批量刪除。所以這里首先執(zhí)行一次批量創(chuàng)建的代碼,確保索引中有多條數(shù)據(jù)供我們查詢。
public class ESTestDocInsertBatch {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//批量新增文檔 --- 請(qǐng)求對(duì)象
BulkRequest request = new BulkRequest();
//以JSON格式批量新增文檔 --- 存入請(qǐng)求體中
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "張起靈","sex","boy","age",21));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "小哥","sex","boy","age",18));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "小宋","sex","boy","age",20));
request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "冷少","sex","boy","age",25));
request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "Java軟件工程師","sex","girl","age",40));
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
//關(guān)閉ES客戶端
esClient.close();
}
}
下面首先進(jìn)行全量查詢操作。
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//1.查詢索引中的全部文檔 --- matchAllQuery 全量查詢
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體 --- 存入搜索請(qǐng)求對(duì)象中
request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.12 條件查詢
做匹配查詢,查詢年齡age=21的文檔內(nèi)容。
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//2.條件查詢--- termQuery age=21
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體 --- 存入搜索請(qǐng)求對(duì)象中
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age",21)));
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.13 分頁查詢
做全量查詢,對(duì)查詢結(jié)果進(jìn)行分頁顯示,每頁2條數(shù)據(jù),查詢第1頁。
查看第幾頁:(頁碼 - 1)*每頁條數(shù)
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//3.分頁查詢
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.from(0);
builder.size(2);
//將構(gòu)建好的查詢請(qǐng)求體存入搜索請(qǐng)求對(duì)象中
request.source(builder);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.14 排序查詢
做全量查詢,對(duì)查詢結(jié)果中的年齡age字段做降序排序。
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//4.對(duì)查詢結(jié)果進(jìn)行排序
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.sort("age", SortOrder.DESC);
//將構(gòu)建好的查詢請(qǐng)求體存入搜索請(qǐng)求對(duì)象中
request.source(builder);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.15 過濾字段查詢
做全量查詢,同時(shí)排除性別sex字段。
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//5.過濾字段
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
String[] excludes = {"sex"};
String[] includes = {};
builder.fetchSource(includes,excludes);
//將構(gòu)建好的查詢請(qǐng)求體存入搜索請(qǐng)求對(duì)象中
request.source(builder);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
1.2.16 組合條件查詢
查詢年齡 age=18 或者 name=張起靈 的文檔內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-474575.html
public class ESTestDocQuery {
public static void main(String[] args) throws IOException {
//創(chuàng)建ES客戶端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
//6.組合查詢
//創(chuàng)建搜索請(qǐng)求對(duì)象
SearchRequest request = new SearchRequest();
//設(shè)置參數(shù) --- 表示查詢哪個(gè)索引中的文檔內(nèi)容
request.indices("user");
//構(gòu)建查詢的請(qǐng)求體
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("age",18));
boolQueryBuilder.should(QueryBuilders.matchQuery("name","張起靈"));
builder.query(boolQueryBuilder);
//將構(gòu)建好的查詢請(qǐng)求體存入搜索請(qǐng)求對(duì)象中
request.source(builder);
//發(fā)送請(qǐng)求 --- 獲取響應(yīng)
SearchResponse response = esClient.search(request,RequestOptions.DEFAULT);
//獲取查詢到的結(jié)果集
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits()); //結(jié)果集的條數(shù)
System.out.println(response.getTook()); //總耗時(shí)
//遍歷結(jié)果集
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//關(guān)閉ES客戶端
esClient.close();
}
}
RestClient.builder(new HttpHost("localhost",9200,"http"))
二、參考鏈接
[01] 分布式全文搜索引擎 Elasticsearch文章來源地址http://www.zghlxwxcb.cn/news/detail-474575.html
到了這里,關(guān)于552、Elasticsearch詳細(xì)入門教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!