ElasticSeach基本概念简要总结
1.什么是全文检索
1.1 全文检索
先建立索引,再对索引进行搜索的过程就叫全文检索
可以使用 Lucene 实现全文检索。Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包。提
供了完整的查询引擎和索引引擎。
1.2 Lucene中核心概念
分词的目的是为了索引,索引的目的是为了搜索
Index:在Lucene中一个索引是放在一个文件夹的,同一文件夹中的所有的文件构成一个Lucene索引。
Segment:按层次保存了从索引,一直到词的包含关系:索引(Index) –> 段(segment) –> 文档
(Document) –> 域(Field) –> 词(Term)
Document:用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。
Field:可以理解为document列的属性。Field有三个属性可选:分词、存储和索引。通过存储属性控制是否对该field的值存储,通过索引属性控制是否对该field索引,通过是否分词来进行索引。这三个属性都是针对field值来设置的,存储的含义是是否在document中存储field值,分词建立的索引是放在索引域中的。
Term:Term是搜索的最小单位,它表示文档的一个词语,Term由两部分组成:它表示的词语和这个词语所出现的Field的名称。
倒排索引:通过分词把词语出现的documentid进行记录下来,再查询的时候先去查到哪些documentid包含这个数据,然后再根据documentid把document数据查出来。
2.ElasticSeach
2.1基本概念
索引库(indices) : indices是index的复数,代表许多的索引,
类型(type)类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引(目前6.X以后的版本只能有一个类型),类似数据库中的表概念。数据库表中有表结构,也就是表中每个字段的约束信息;索引库的类型中对应表结构的叫做映射(mapping) ,用来定义每个字段的约束。
文档(document)存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置(mappings)字段的数据类型、属性、是否索引、是否存储等特性
2.2使用Kibana查看索引库的操作
注意:在ES中,需要进行聚合、排序、过滤的字段其处理方式比较特殊,因此不能被分词,必须使用
keyword 或数值类型。
GET /索引库名/_mapping -----------查看索引库中的所有类型映射
GET /索引库名/_mapping/类型名 --------------查看索引库中的某一类型映射
GET /索引库名/类型名/(documentid) -------------- 查看索引库中某一文档的数据
GET /索引库名/_search -------------常用的有五种查询类型
{
"_source": [], //指定查询结果的字段,默认是所有字段都会被查出来
"query":{
"查询类型":{
"查询条件":"查询条件值",
"filter":{} // 对结果集进行过滤
}
},
"sort":[],
"from":num, //分页查询--起始数据
"size":num //分页查询--总共条数
"highlight": {
"pre_tags": "<em>",
"post_tags": "</em>",
"fields": {
"查询的字段名": {} //这里表示的是需要查询字段中高亮的字段名称
}
}
}
2.3ElasticSearch集群
单点ES存在的问题:无法实现高存储,高可用,高并发(一个集群三者都解决)
2.3.1shard与replica机制
(1)每个document肯定只存在于某一个主分片以及其对应的副本分片中,不可能存在于多个主分片
(2)replica shard是primary shard的副本,负责容错,以及承担读请求负载
注意:副本分片只负责读请求,在写请求时,只会在主分片上修改数据,然后再从主分片同步到副本分片
(3)primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改
2.3.2集群写入数据的原理
- 客户端选择一个node发送请求过去,这个node就是coordinating node (协调节点)
- coordinating node对document进行路由,将请求转发给对应的node。(取模算法选择对应结点)
- 实际上的node上的primary shard处理请求,将数据保存在本地,然后将数据同步到replica node
- coordinating node如果发现primary node和所有的replica node都搞定之后,就会返回请求到
客户端。
2.3.3集群查询数据原理
- 客户端发送一个请求给coordinate node
- 协调节点将搜索的请求转发给所有的shard对应的primary shard 或replica shard
- query phase(查询阶段):每一个shard 将自己搜索的结果(其实也就是一些唯一标识),返回
给协调节点,有协调节点进行数据的合并,排序,分页等操作,产出最后的结果 - fetch phase(获取阶段) ,接着由协调节点,根据唯一标识去各个节点进行拉取数据,最终返回
给客户端。