ElasticSearch-CURD操作及高亮查询
前言:
Elasticsearch是一个开源的分布式、RESTful风格的搜索和分析引擎,它可以用于全文搜索、结构化搜索以及分析。Elasticsearch最初是由Apache软件基金会开发的,现在已成为一个独立的公司,名为Elastic。
Elasticsearch的主要作用
全文搜索 :Elasticsearch能够对大量文本数据进行快速、准确的搜索。它支持多种查询类型,如短语查询、布尔查询、范围查询等,并能根据相关性得分对结果进行排序。
实时数据分析 :Elasticsearch具有实时分析能力,可以对不断产生的数据进行索引和搜索。这使得它非常适合用于日志分析、监控系统、业务指标跟踪等场景。
分布式架构 :Elasticsearch采用分布式架构,可以在多个节点上并行处理请求,从而提高系统的可扩展性和容错能力。
高可用性 :Elasticsearch通过副本集和分片机制实现数据的冗余存储和负载均衡,确保在某个节点出现故障时,其他节点仍能正常提供服务。
易于使用和集成 :Elasticsearch提供了丰富的API和客户端库,支持多种编程语言(如Java、Python、JavaScript等),方便用户与现有系统进行集成。
Elasticsearch的使用–CURD
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.torlesse</groupId>
<artifactId>torlesse-es-highlight</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<elasticsearch.version>7.7.0</elasticsearch.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<!-- ElasticSearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- devtools热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- lombok 需要安装插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
创建索引
/**
* 创建索引
*/
@Test
public void createIndex() throws IOException {
CreateIndexRequest createIndexRequest = new CreateIndexRequest("my_index");
IndicesClient indices = restHighLevelClient.indices();
CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
//创建了啥索引
System.out.println(createIndexResponse.index());
}
判断索引是否存在
/**
* 判断索引是否存在
*/
@Test
public void isIndexExist() throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest("my_index");
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
添加文档
/**
* 添加文档
* (先创建一个User实体类,添加fastjson依赖)
*/
@Test
public void testAddDocument() throws IOException {
IndexRequest indexRequest = new IndexRequest("my_index");
indexRequest.id(String.valueOf(9));
User user = new User("zhangsan","广东 广州");
indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.status());
System.out.println(indexResponse);
}
获取文档信息
/**
* 获取文档信息
*/
@Test
public void getDocument() throws IOException {
GetRequest getRequest = new GetRequest("my_index","1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsMap());
User user = JSON.parseObject(getResponse.getSourceAsString(), User.class);
System.out.println(user);
System.out.println(getResponse);
restHighLevelClient.close();
}
测试文档是否存在
/**
* 测试文档是否存在
*/
@Test
public void testDocumentIsExists() throws IOException {
GetRequest getRequest = new GetRequest("my_index", "1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.isExists());
System.out.println(getResponse);
}
批量添加文档
/**
* 批量添加文档
*/
@Test
public void patchAddDocument() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> users = new ArrayList<>();
users.add(new User("torlesse-1","广东 广州"));
users.add(new User("torlesse-2","广东 广州"));
users.add(new User("torlesse-3","广东 广州"));
users.add(new User("torlesse-4","广东 广州"));
users.add(new User("torlesse-5","广东 广州"));
users.add(new User("torlesse-6","广东 广州"));
users.forEach((user) -> bulkRequest.add(
new IndexRequest("my_index").id(String.valueOf(users.indexOf(user))).source(JSON.toJSONString(user),XContentType.JSON)
));
BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkItemResponses.status());
}
更新文档
/**
* 更新文档
*/
@Test
public void updateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("my_index", "1");
User user = new User("torlesse-1", "广东 佛山");
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
System.out.println(updateResponse);
}
删除单个索引
/**
* 删除单个索引
* @throws IOException
*/
@Test
public void delIndex() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("jd_goods","1");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
删除多个
/**
* 删除多个
* @throws IOException
*/
@Test
public void delMoreIndex() throws IOException {
for (int i = 2; i < 30; i++) {
restHighLevelClient.delete(new DeleteRequest("jd_goods",String.valueOf(i)), RequestOptions.DEFAULT);
}
}
高亮查询
/**
* 高亮查询
*/
@Test
public void testHighLightSearch() throws IOException {
//1、创建查询请求对象
SearchRequest searchRequest = new SearchRequest("my_index");
//2、构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//精准查询
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username", "zhangsan");
//匹配查询
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("username", "torlesse");
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
// 高亮 =========
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("username");
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.query(matchQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
List<Map<String, Object>> results = new ArrayList<>();
for (SearchHit documentFields : hits.getHits()) {
// 使用新的字段值(高亮),覆盖旧的字段值
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
System.out.println(sourceAsMap);
// 高亮字段
Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
HighlightField name = highlightFields.get("username");
// 替换
if (name != null){
Text[] fragments = name.fragments();
StringBuilder new_name = new StringBuilder();
for (Text text : fragments) {
new_name.append(text);
}
sourceAsMap.put("username",new_name.toString());
}
results.add(sourceAsMap);
}
System.out.println(results);
}
项目地址:Elastic-Search-CURD
书籍推荐
以下是一些关于Elasticsearch的书籍推荐及其理由:
- 《Elasticsearch: The Definitive Guide》:本书讲解了Elasticsearch的基本使用方法,基础且全面,适合入门。
- 《深入浅出Elasticsearch》:本书主要展示如何使用Elasticsearch构建可扩展的搜索应用程序。全书共分两个部分,第一部分解释了核心特性,内容主要涉及Elasticsearch的介绍,数据的索引、更新和删除,数据的搜索,数据的分析,使用相关性进行搜索,使用聚集来探索数据,文档间的关系等;第二部分介绍每个特性工作的更多细节及其对性能和可扩展性的影响,以便对核心功能进行产品化。
- 《Elasticsearch权威指南》:本书是一本全面而深入地介绍Elasticsearch的书籍。它涵盖了从基础知识到高级主题的所有内容,并提供了大量示例和代码。