ElasticSearch基础入门和基本概念 - 详解
1. 全文检索
1.1 什么是全文检索
全文检索是一种通过对文本内容进行全面索引和搜索的技术,可以快速在大量文本数据中查找包含特定关键词或短语的文档。
查询 vs 检索:
- 查询:有明确的搜索条件边界(如年龄15~25岁,颜色=红色)
- 检索:无搜索条件边界,召回结果取决于相关性(同义词、谐音、别名等)
1.2 全文检索的原理
- 文本处理:分词、去除停用词等
- 建立索引:使用倒排索引记录单词位置、词频、权重等
- 搜索匹配:根据关键词查找匹配文档,按相关性排序
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安装:
- 下载7.17.3版本
- 配置JDK环境(ES_JAVA_HOME > JAVA_HOME > ES_HOME)
- 运行elasticsearch.bat
- 验证: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操作
# 创建文档(指定ID)
PUT /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变化