全文检索-ElasticSearch

本文介绍了Elasticsearch的常见搜索方式,包括Match查询、Phrase查询、Prefix查询和Fuzzy查询,并展示了如何在SpringBoot应用中使用JavaAPI实现这些搜索。同时,详细说明了如何创建索引、添加文档以及执行全文搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

综述

搜索方式

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。


尝试运行

  1. 安装 Elasticsearch
    可以从 Elasticsearch 的官网下载最新的版本进行安装,或者使用 Docker 运行 Elasticsearch。
    • docker:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.16.3
- 下载:

如果要加入springboot中使用请参照下文的版本事项进行下载
elastic下载链接

  1. 创建索引
    在 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"
        }
      }
    }
  }
}
'
  1. 添加文档
    向索引中添加文档。文档是 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."
}
'
  1. 执行全文搜索
    使用 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 的具体步骤:

  1. 添加依赖
    在 pom.xml 文件中添加 Spring Data Elasticsearch 的依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 配置 Elasticsearch
    在 application.properties 文件中配置 Elasticsearch:
spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=localhost:9300
  1. 创建实体类
    创建需要存储在 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;
}
  1. 创建 Elasticsearch 仓库接口
    创建 Elasticsearch 仓库接口,并继承 ElasticsearchRepository。ElasticsearchRepository 是 Spring Data Elasticsearch 提供的接口,包含了常见的 Elasticsearch 操作方法。
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface TestRepository extends ElasticsearchRepository<TestEntity, String> {
}
  1. 使用 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 实现常用搜索方式的示例,可以根据需要选择合适的搜索方式来实现全文搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值