玩转SpringBoot和Elasticsearch:模糊查询、排序、分页、高亮一网打尽!
2022-12-14 09:46:11
Springboot与Elasticsearch完美融合:玩转搜索新体验
拥抱Elasticsearch,开启强大搜索新篇章
在现代网络应用中,搜索功能扮演着至关重要的角色。无论是电子商务网站还是内容丰富的博客,强大的搜索功能都是用户体验的基石。而说到搜索,Elasticsearch无疑是您的不二之选。它不仅拥有无与伦比的搜索能力,还支持多种多样的查询类型,如模糊查询、排序、分页、高亮等等。
一步步指南:将Elasticsearch注入您的项目
1. 构建SpringBoot项目:
创建一个新的SpringBoot项目,或选择一个现有的项目作为起点。
2. 引入Elasticsearch依赖:
在项目的pom.xml文件中添加Elasticsearch依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.6.7</version>
</dependency>
3. 创建Elasticsearch客户端:
使用Elasticsearch官方客户端或第三方客户端创建客户端对象:
ElasticsearchClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200))
);
4. 配置Elasticsearch索引和类型:
定义要使用的Elasticsearch索引和类型,并设置必要的映射:
CreateIndexRequest request = new CreateIndexRequest("my_index");
request.settings(Settings.builder()
.put("index.number_of_shards", 5)
.put("index.number_of_replicas", 1)
);
client.indices().create(request, RequestOptions.DEFAULT);
5. 操作Elasticsearch数据:
使用客户端对象对数据进行索引、更新、删除等操作:
IndexRequest indexRequest = new IndexRequest("my_index", "my_type", "1");
indexRequest.source(jsonBuilder()
.startObject()
.field("title", "Elasticsearch Tutorial")
.field("content", "This is an Elasticsearch tutorial.")
.endObject());
client.index(indexRequest, RequestOptions.DEFAULT);
6. 进行搜索查询:
使用Elasticsearch提供的查询DSL进行模糊查询、排序、分页、高亮等查询操作:
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(jsonBuilder()
.startObject()
.query(
QueryBuilders.matchQuery("content", "Elasticsearch")
.fuzziness(Fuzziness.TWO)
)
.endObject());
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印查询结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
代码示例:让Elasticsearch操作轻松自如
// 创建Elasticsearch客户端对象
ElasticsearchClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200))
);
// 创建索引和类型
CreateIndexRequest request = new CreateIndexRequest("my_index");
request.settings(Settings.builder()
.put("index.number_of_shards", 5)
.put("index.number_of_replicas", 1)
);
client.indices().create(request, RequestOptions.DEFAULT);
// 索引文档
IndexRequest indexRequest = new IndexRequest("my_index", "my_type", "1");
indexRequest.source(jsonBuilder()
.startObject()
.field("title", "Elasticsearch Tutorial")
.field("content", "This is an Elasticsearch tutorial.")
.endObject());
client.index(indexRequest, RequestOptions.DEFAULT);
// 进行模糊查询
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(jsonBuilder()
.startObject()
.query(
QueryBuilders.matchQuery("content", "Elasticsearch")
.fuzziness(Fuzziness.TWO)
)
.endObject());
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印查询结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
// 进行排序查询
searchRequest = new SearchRequest("my_index");
searchRequest.source(jsonBuilder()
.startObject()
.query(QueryBuilders.matchAllQuery())
.sort(
SortBuilders.fieldSort("title")
.order(SortOrder.ASC)
)
.endObject());
response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印查询结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
// 进行分页查询
searchRequest = new SearchRequest("my_index");
searchRequest.source(jsonBuilder()
.startObject()
.query(QueryBuilders.matchAllQuery())
.from(0)
.size(10)
.endObject());
response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印查询结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
// 进行高亮查询
searchRequest = new SearchRequest("my_index");
searchRequest.source(jsonBuilder()
.startObject()
.query(QueryBuilders.matchQuery("title", "Elasticsearch"))
.highlight(
HighlightBuilder.highlightFields()
.field("title")
.preTags("<b>")
.postTags("</b>")
)
.endObject());
response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印查询结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getHighlightFields());
}
结语:开启搜索新时代
还在为搜索功能而烦恼吗?别再犹豫了,快来体验Elasticsearch与SpringBoot的强强联合!Elasticsearch强大的搜索能力和丰富的查询类型,定会让您的搜索功能脱胎换骨,为用户带来前所未有的搜索体验。
常见问题解答:
1. Elasticsearch与其他搜索引擎有什么不同?
Elasticsearch是一个分布式、可扩展的开源搜索和分析引擎,而传统的搜索引擎通常是集中式的,无法轻松扩展。Elasticsearch具有强大的搜索能力,支持多种查询类型和聚合功能。
2. 使用Elasticsearch需要哪些技术栈?
使用Elasticsearch需要了解Java、SpringBoot和Elasticsearch的基础知识。您还需要熟悉JSON和RESTful API。
3. Elasticsearch的优势有哪些?
Elasticsearch的优势包括:分布式和可扩展,支持多种查询类型,强大的聚合功能,可用于各种应用程序,拥有活跃的社区支持。
4. 使用Elasticsearch有哪些最佳实践?
使用Elasticsearch的最佳实践包括:使用适当的索引和类型,优化查询,使用聚合功能,监控Elasticsearch集群,定期备份数据。
5. Elasticsearch的未来发展趋势是什么?
Elasticsearch的未来发展趋势包括:与其他技术(如机器学习和自然语言处理)的集成,对无模式数据的支持增强,对云平台的支持增强,性能和可扩展性的持续改进。