ElasticSearch基础入门和基本概念 - 详解

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 技术选型对比

特性ElasticsearchSolrMongoDBMySQL
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变化

posted on 2025-10-13 09:18  slgkaifa  阅读(5)  评论(0)    收藏  举报

导航