1. 全文检索

1.1 什么是全文检索

全文检索是一种通过对文本内容进行全面索引和搜索的技术,可以快速在大量文本数据中查找包含特定关键词或短语的文档。

查询 vs 检索:

  • 查询:有明确的搜索条件边界(如年龄15~25岁,颜色=红色)
  • 检索:无搜索条件边界,召回结果取决于相关性(同义词、谐音、别名等)

1.2 全文检索的原理

  1. 文本处理:分词、去除停用词等
  2. 建立索引:使用倒排索引记录单词位置、词频、权重等
  3. 搜索匹配:根据关键词查找匹配文档,按相关性排序

1.3 倒排索引

正排索引:文档→内容(如MySQL通过ID查找)
倒排索引:单词→文档列表(建立关键词与文章的对应关系)

2. ElasticSearch简介

2.1 ElasticSearch介绍

开源分布式搜索和数据分析引擎,基于Java开发,近乎实时搜索。

特点:

  • 分布式架构,水平扩展
  • 强大的全文检索功能
  • 多语言支持
  • 高性能,实时性
  • 易用的RESTful API

2.2 应用场景

  • 搜索引擎、站内搜索
  • 日志管理与分析
  • 大数据分析

2.3 技术选型对比

特性 Elasticsearch Solr MongoDB MySQL
DB类型 搜索引擎 搜索引擎 文档数据库 关系型数据库
分布式 原生支持 支持 原生支持 不支持
事务支持 不支持 不支持 多文档ACID事务 支持
擅长领域 海量数据全文检索 大数据聚合分析 海量数据CRUD 强一致性事务

3. ElasticSearch环境搭建

3.1 安装ElasticSearch

Windows安装:

  1. 下载7.17.3版本
  2. 配置JDK环境(ES_JAVA_HOME > JAVA_HOME > ES_HOME)
  3. 运行elasticsearch.bat
  4. 验证:http://localhost:9200/

Linux安装:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-linux-x86_64.tar.gz

重要配置:

network.host: 0.0.0.0          # 开启远程访问
discovery.type: single-node    # 单节点模式

JVM配置:

  • Xms和Xmx设置成一样
  • 不超过机器内存的50%
  • 不要超过30GB

3.2 安装Kibana

配置kibana.yml:

server.port: 5601
server.host: "localhost"
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "zh-CN"

3.3 安装分词插件

在线安装:

bin/elasticsearch-plugin install analysis-icu

IK分词器:

  • ik_smart:最粗粒度拆分
  • ik_max_word:最细粒度拆分

4. ElasticSearch核心概念

4.1 核心组件

  • 节点(Node):ES实例
  • 角色(Roles):主节点、候选节点、数据节点、预处理节点
  • 索引(Index):等价于MySQL中的表(7.x+)
  • 文档(Document):最小数据单元(JSON格式)

4.2 文档元数据

  • _index:所属索引名
  • _id:文档唯一id
  • _source:原始JSON数据
  • _version:版本号
  • _seq_no:严格递增序号
  • _primary_term:主分片任期

5. 索引操作

5.1 基本操作

PUT /es_db                    # 创建索引
GET /es_db                    # 查询索引
DELETE /es_db                 # 删除索引
HEAD /es_db                   # 检查存在

5.2 Settings配置

PUT /es_db
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2,
        "analysis.analyzer.default.type": "ik_max_word"
    }
}

5.3 Mapping映射

动态映射: ES自动推断类型

PUT /user/_doc/1
{
  "name": "zhangsan",
  "age": 32,
  "address": "北京海淀区"
}

静态映射: 显式定义字段类型

PUT /user
{
  "mappings": {
    "properties": {
      "name": {"type": "keyword"},
      "age": {"type": "long"},
      "address": {"type": "text"}
    }
  }
}

5.4 重要Mapping参数

  • index:是否创建倒排索引
  • dynamic:控制动态添加字段
  • doc_values:优化排序聚合
  • null_value:为null设置默认值

6. 文档操作

6.1 CRUD操作

# 创建文档(指定IDPUT /es_db/_doc/1
{
  "name": "张三",
  "age": 25,
  "address": "北京朝阳公园"
}

# 查询文档
GET /es_db/_doc/1

# 全量更新
PUT /es_db/_doc/1
{
  "name": "张三",
  "age": 25
}

# 部分更新
POST /es_db/_update/1
{
  "doc": {"age": 28}
}

# 删除文档
DELETE /es_db/_doc/1

6.2 批量操作

POST _bulk
{"index":{"_index":"article","_id":3}}
{"title":"zhangsan","content":"zhangsan-666"}
{"index":{"_index":"article","_id":4}}
{"title":"李四","content":"李四是个厉害的厨子"}

6.3 批量读取

GET _mget
{
  "docs": [
    {"_index": "es_db", "_id": 1},
    {"_index": "article", "_id": 4}
  ]
}

7. Spring Boot整合实战

7.1 依赖配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

7.2 实体类定义

@Data
@Document(indexName = "employees")
public class Employee {
    @Id
    private Long id;
    @Field(type = FieldType.Keyword)
    private String name;
    private int sex;
    private int age;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String address;
    private String remark;
}

7.3 Repository接口

@Repository
public interface EmployeeRepository extends ElasticsearchRepository<Employee, Long> {
    List<Employee> findByName(String name);
}

7.4 模板操作

@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;

// 索引操作
IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("employee_index"));

// 复杂查询
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withQuery(QueryBuilders.matchQuery("address", "公园"));
builder.withPageable(PageRequest.of(0, 5));

8. 注意事项

8.1 生产环境建议

  • 为ES创建专用用户(非root)
  • 修改数据存储路径(避免升级误删)
  • 合理配置JVM内存
  • 设置适当的副本数

8.2 性能优化

  • 避免动态映射生产环境
  • 合理设置分片数
  • 禁用不必要的字段索引
  • 使用批量操作减少网络开销

8.3 版本兼容

  • ES 7.x+ 移除type概念
  • 注意Spring Data Elasticsearch版本对应关系
  • 升级时注意API变化
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐