1. 概述
1.1 ElasticStack特点
- 使用门槛低,开发周期短,上线快
- 性能好,查询快,实时展示结果
- 扩容方便,快速支撑增长迅猛的数据
1.2 ElasticStack各组件作用
Beats:数据采集
LogStash: 数据处理
ElasticSearch(核心引擎): 数据存储、查询和分析
Kibana: 数据探索与可视化分析
1.3 ElasticStack使用场景
1.4 ElasticStack安装启动
ElasticSearch启动:解压到安装目录,启动bin/elasticsearch(默认端口:http:\\localhost:9200, 加参数-d后台启动)
ElasticSearch集群:
bin/elasticsearch -d
bin/elasticsearch -Ehttp.port=8200 -Epath.data=node2 -d
bin/elasticsearch -Ehttp.port=7200 -Epath.data=node3 -d
- Kibana启动:解压到安装目录,启动
bin/kibana(默认端口:http:\\localhost:5601)
1.5 ElasticSearch常见术语
Document(文档):用户存储在ES中的数据文档
Index(索引):由具有相同字段的文档列表组成
field(字段):包含具体数据
Node(节点):一个ES的实例,构成clister的单元
Cluster(集群):对外服务的一个/多个节点
1.6 Document介绍
- 常用数据类型:字符串、数值型、布尔型、日期型、二进制、范围类型
- 每个文档都有一个唯一
ID标识。(可以自行指定,也可由ES自动生成)
- 元数据,用于标注文档的相关信息:
_index:文档所在的索引名
_type:文档所在的类型名(后续的版本中type这个概念将会被移除,也不允许一个索引中有多个类型)
_id:文档唯一标识
_source:文档的原始JSON数据,可从这获取每个字段的内容
_all:整合所有字段内容到该字段。(默认禁用)
_version:文档字段版本号,标识被操作了几次
Index介绍:
- 索引中存储相同结构的文档,且每个index都有自己的Mapping定义,用于定义字段名和类型;
- 一个集群中可以有多个inex,类似于可以有多个table。
RESTful API两种交互方式:
- CURL命令行:curl -XPUT xxx
- Kibana DevTools————PUT xxx{ }
Index API: 用户创建、删除、获取索引配置等。
- 创建索引:
PUT /test_index #创建一个名为test_index的索引
- 查看索引:
GET _cat/indices #查看所有的索引
- 删除索引:
DELETE /test_index #删除名为test_index的索引
- 创建文档
# 创建ID为1的Document
PUT /test_index/doc/1
{
"username":"alfred",
"age":"24"
}
#
# 不指定ID创建Document(ID会自动生成)
POST /test_index/doc
{
"username":"buzhiding",
"age":"1"
}
- 查询文档:
# 查看名为test_index的索引中id为1的文档
GET /test_index/doc/1
#
# 查询所有文档:
# 查询名为test_index的索引中所有文档,用到endpoint:_search,默认返回符合的前10条
# term和match的区别:term完全匹配,不进行分词器分析;match模糊匹配,进行分词器分析,包含即返回
GET /test_index/doc/_search
{
"query":{
"term":{
"_id":"1"
}
}
}
- 批量操作文档:
# 批量创建文档,用到endpoint:_bulk
# index和create的区别,如果文档存在时,使用create会报错,而index会覆盖
POST _bulk
{"index":{"_index":"test_index","_type":"doc","_id":"3"}}
{"username":"alfred","age":"20"}
{"delete":{"_index":"test_index","_type":"doc","_id":"1"}}
{"update":{"_id":"2","_index":"test_index","_type":"doc"}}
{"doc":{"age":"30"}}
#
# 批量查询文档,使用endpoint:_mget
GET _mget
{
"doc":[
{
"_index":"test_index",
"_type":"doc",
"_id":"1"
},
{
"_index":"test_index",
"_type":"doc",
"_id":"2"
}
]
}
- 删除文档:
# 根据搜索内容删除文档,使用endpoint:_delete_by_query
POST /test_index/doc/_delete_by_query
{
"query":{
"match":{
"username":"buzhiding"
}
}
}
#
# 删除整个test_index的索引中的文档,依然使用endpoint:_delete_by_query
POST /test_index/doc/_delete_by_query
{
"query":{
"match_all":{}
}
}
2. ElasticSearch倒排索引与分词
2.1 倒排索引
- 正排索引和倒排索引
- 正排索引:文档ID —> 文档内容
- 倒排索引:单词—> 文档ID列表
- 倒排索引组成:(单词词典,倒排列表)
- 单词词典(
Term Dictionary)
- 记录所有文档的单词,记录了单词到倒排列表的关联信息,一般使用
B+Tree实现。
- 倒排列表(
Posting List)
- 记录单词对应的文档集合,由倒排索引项
Posting List组成。
- 倒排索引项:
- 文档
ID:用于获取原始信息。
- 词频
TF:记录该单词在该文档中的出现次数,用于计算相关性得分。
- 位置
Position:记录单词在文档中的分词位置(多个),用于词语搜索。
- 偏移
Offset:记录单词在文档的开始和结束位置,用于高亮显示。
2.2 分词Analysis
分词:将文本转换成一系列单词Term/Token的过程,也可称作文本分析,ES中叫作:Analysis。