综述
搜索方式
Elasticsearch 提供了多种搜索方式,以下是其中几种常用的搜索方式:
Match查询
Match 查询是 Elasticsearch 中最简单的一种查询方式,它会匹配查询关键字并返回所有匹配到的文档。Match 查询支持模糊匹配,即可以通过模糊匹配实现全文搜索。以下是 Match 查询的示例:
{
"query": {
"match": {
"content": "Elasticsearch"
}
}
}
以上查询会返回 content 字段中包含 Elasticsearch 的文档。
Phrase查询
Phrase 查询可以匹配一个完整的短语,而不是单个单词。Phrase 查询需要指定查询的字段和要查询的短语。以下是 Phrase 查询的示例:
{
"query": {
"match_phrase": {
"content": "Elasticsearch is a distributed"
}
}
}
以上查询会返回 content 字段中包含 “Elasticsearch is a distributed” 这个短语的文档。
Prefix查询
Prefix 查询用于查询以指定前缀开头的文本。例如,可以使用 Prefix 查询查找所有以特定前缀开头的单词。以下是 Prefix 查询的示例:
{
"query": {
"prefix": {
"content": "Elast"
}
}
}
以上查询会返回 content 字段中以 “Elast” 开头的文本。
Fuzzy查询
Fuzzy 查询用于模糊匹配单词,它可以在不知道确切拼写的情况下找到相似的单词。Fuzzy 查询可以指定最大编辑距离,编辑距离越小,匹配的单词越相似。以下是 Fuzzy 查询的示例:
{
"query": {
"fuzzy": {
"content": {
"value": "Elasticsarch",
"fuzziness": "2"
}
}
}
}
以上查询会返回 content 字段中与 “Elasticsarch” 拼写相似的单词,最大编辑距离为 2。
尝试运行
- 安装 Elasticsearch
可以从 Elasticsearch 的官网下载最新的版本进行安装,或者使用 Docker 运行 Elasticsearch。- docker:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.16.3
- 下载:
如果要加入springboot中使用请参照下文的版本事项进行下载
elastic下载链接
- 创建索引
在 Elasticsearch 中,数据存储在索引中。要进行全文搜索,需要先创建索引并定义文档的映射。可以使用 Elasticsearch 的 API 或者 Kibana 界面来创建索引。
这里我们使用 Elasticsearch 的 API 来创建名为 test_index 的索引,并定义一个包含标题和内容字段的文档类型 test_type:
curl -X PUT "http://localhost:9200/test_index" -H 'Content-Type: application/json' -d'
{
"mappings": {
"test_type": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
}
}
}
}
}
'
- 添加文档
向索引中添加文档。文档是 Elasticsearch 中的基本数据单元,可以使用 Elasticsearch 的 API 或者 Kibana 界面来添加文档。在添加文档的同时,可以指定文档的类型和字段,以便后续进行全文搜索。
这里我们向 test_index 索引中添加两个文档,分别包含标题和内容字段:
curl -X POST "http://localhost:9200/test_index/test_type/1" -H 'Content-Type: application/json' -d'
{
"title": "apple",
"content": "Apple is a fruit."
}
'
curl -X POST "http://localhost:9200/test_index/test_type/2" -H 'Content-Type: application/json' -d'
{
"title": "banana",
"content": "Banana is a fruit too."
}
'
- 执行全文搜索
使用 Elasticsearch 的 Query DSL 语言进行全文搜索。例如,要搜索包含关键字 “apple” 的文档,可以使用以下 Query DSL 语句:
curl -X GET "http://localhost:9200/test_index/test_type/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"content": "apple"
}
}
}
'
这将返回包含 “apple” 关键字的文档:
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "test_index",
"_type": "test_type",
"_id": "1",
"_score": 0
}
]
}
}
elastic结合springboot(重点)
结合 Elasticsearch 和 Spring Boot,可以使用 Spring Data Elasticsearch,它是 Spring Data 的一个模块,提供了对 Elasticsearch 的集成支持。
版本事项
但是一定要注意版本的相关问题,因为用错了就会启动不起来
elastic和springboot版本兼容表格
使用步骤
以下是使用 Spring Data Elasticsearch 的具体步骤:
- 添加依赖
在 pom.xml 文件中添加 Spring Data Elasticsearch 的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 配置 Elasticsearch
在 application.properties 文件中配置 Elasticsearch:
spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=localhost:9300
- 创建实体类
创建需要存储在 Elasticsearch 中的实体类。实体类需要使用 @Document 注解标记,并指定索引和类型:
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "test_index", type = "test_type")
@Data
public class TestEntity {
private String title;
private String content;
}
- 创建 Elasticsearch 仓库接口
创建 Elasticsearch 仓库接口,并继承 ElasticsearchRepository。ElasticsearchRepository 是 Spring Data Elasticsearch 提供的接口,包含了常见的 Elasticsearch 操作方法。
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface TestRepository extends ElasticsearchRepository<TestEntity, String> {
}
- 使用 Elasticsearch 仓库接口
在代码中使用 Elasticsearch 仓库接口进行 Elasticsearch 操作。例如,要执行全文搜索,可以使用 ElasticsearchRepository 的 search() 方法:
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TestService {
@Autowired
private TestRepository testRepository;
@Autowired
private ElasticsearchOperations elasticsearchOperations;
public List<TestEntity> search(String query) {
return testRepository.search(QueryBuilders.matchQuery("content", query));
}
}
这将返回包含指定关键字的 TestEntity 列表。
搜索方式-java
当使用 Spring Boot 集成 Elasticsearch 时,可以使用 Elasticsearch 的 Java API 来实现各种搜索方式。以下是使用 Spring Boot 和 Elasticsearch 的 Java API 实现常用搜索方式的示例:
Match查询-java
SearchRequest searchRequest = new SearchRequest("indexName");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", "Elasticsearch");
searchSourceBuilder.query(matchQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
以上代码使用 MatchQueryBuilder 实现了 Match 查询,匹配 “content” 字段中包含 “Elasticsearch” 的文档。
Phrase查询-java
SearchRequest searchRequest = new SearchRequest("indexName");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("content", "Elasticsearch is a distributed");
searchSourceBuilder.query(matchPhraseQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
以上代码使用 MatchPhraseQueryBuilder 实现了 Phrase 查询,匹配 “content” 字段中包含短语 “Elasticsearch is a distributed” 的文档。
Prefix查询-java
SearchRequest searchRequest = new SearchRequest("indexName");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("content", "Elast");
searchSourceBuilder.query(prefixQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
以上代码使用 PrefixQueryBuilder 实现了 Prefix 查询,匹配 “content” 字段中以 “Elast” 开头的文本。
Fuzzy查询-java
SearchRequest searchRequest = new SearchRequest("indexName");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("content", "Elasticsarch").fuzziness(Fuzziness.TWO);
searchSourceBuilder.query(fuzzyQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
以上代码使用 FuzzyQueryBuilder 实现了 Fuzzy 查询,匹配 “content” 字段中与 “Elasticsarch” 拼写相似的单词,最大编辑距离为 2。
以上是使用 Spring Boot 和 Elasticsearch 的 Java API 实现常用搜索方式的示例,可以根据需要选择合适的搜索方式来实现全文搜索。