概述
1. 什么是 Elasticsearch
Elasticsearch 是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容:

Elasticsearch 结合 kibana, Logstash, Beats,也就是 elastic stack(ELK),被广泛用于在日志数据分析、实时监控等领域:

elasticsearch 是 elsatic stack 的核心,负责存储、搜索、分析数据:

搜索引擎技术排名;
- Elasticsearch:开源的分布式搜索引擎
- Splunk:商业项目
- Solr:Apache 的开源搜索引擎
2. Elasticsearch 的发展史
Lucene 是一个 java 语言的搜索引擎类库,是 Apache 公司的顶级项目,由 DungCutting 于 1999 年研发 。
Lucene 的优点 | Lucene 的缺点 |
---|---|
易扩展 | 只限于 Java 语言开发 |
高性能(基于倒排索引) | 学习曲线陡峭 |
不支持水平扩展 |
2004 年,Shay Banon 基于 Lucene 开发了 Compass;
2010 年,Shay Banon 重写了 Compass,取名为 Elasticsearch。
相比于 lucene,elasticsearch 具备下列优势:
- 支持分布式,可水平扩展
- 提供 Restful 接口,可被任何语言调用
3. 正向索引和倒排索引
传统数据库(如 MySQL)采用正向索引——基于记录 id 创建索引,查询词条时必须先找到记录,而后判断是否包含该词条。如,给下表 (tb_goods) 中的 id 创建索引:
而 elasticsearch 采用倒排索引——对文档内容分词,对词条进行索引,并记录词条所在文档的信息,查询时先根据词条查询到文档 id,而后获取到文档。即:
- 文档(document):每条数据就是一个文档
- 词条(term):文档按照语义分成的词语

4. 文档、字段、索引、映射
elasticsearch 是面向文档存储的,文档可以是数据库中的一条商品数据,一个订单信息等,总之,一条数据就是一个文档。
文档数据会被序列化为 json 格式化存储在 elasticsearch 中。

索引:
- 索引(index):相同类型的文档的集合
- 映射(mapping):索引中文档的字段约束信息,类似表的结构约束

MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是(同类型)文档的集合,类似数据库的表(table) |
Row | Document | 文档(Docuemnt),就是一条条的数据,类似数据库中的行(Row),文档都是 JSON 格式 |
Column | Field | 字段(Field),就是 JSON 文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL 是 elasticsearch 提供的 JSON 风格的请求语句,用来操作 elasticsearch,实现 CRUD |
MySQL:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算

5. 分词器
ES 在创建倒排索引时需要对文档分词,在搜索时,需要对用户输入内容分词,但默认的分词规则对中文处理并不友好,例如:
POST /_analyze
{
"analyzer": "standard",
"text": "黑马程序员学习 java 太棒了"
}
语法说明:
POST
:请求方式/_analyze
:请求路径,这里省略了 http://192.168.150.101:9200,由 kibana 自动补充- 请求参数:json 风格
analyzer
:分词器类型,这里是默认的 standard 分词器text
:要分词的内容
IK 分词器
对于中文分词,一般会使用 IK 分词器。
对于 IK 分词器的安装,以后再说吧。.....
IK 分词器包含两种模式:
ik_smart
:智能切分,粗粒度ik_max_word
:最细切分,细粒度
IK 分词器——拓展词库
要拓展 IK 分词器,只要修改一个 IK 分词器目录中的 config 目录中的 IKAnalyzer.cfg.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!-- 用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry>
</properties>
然后在名为 ext.dic 的文件中,添加想要拓展的词语即可:
传智播客
奥力给
IK 分词器——停用词库
要禁用某些敏感词条,只需要修改一个 IK 分词器目录中的 config 目录中的 IKAnalyzer.cfg.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!-- 用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry>
<!-- 用户可以在这里配置自己的扩展停止字典 -->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>
然后在名为 stopword.dic 的文件中,添加想要拓展的词语即可:
习大大
6. 部署 ES
暂略......
- 部署单点 ES
- 部署 kibana
- 安装 IK 分词器
- 部署 ES 集群