Elasticsearch面向文档型的NoSQL数据库,继承了Lucene的简洁语法表述,同时分布式实时文件存储,实时分析的分布式搜索引擎,可单台PC运行亦可集群。
目录标题
1、Elasticsearch的全文检索库——Lucene
-
lucene基础概念
文档(document):索引与搜索的主要数据载体,存放要写入索引或者将从索引搜索出来的数据
字段(field):文档的一个片段,包括字段名称和内容
词项(term):搜索时的一个单位,代表文本中的某个词
词条(token):词项在字段中的一次出现,包括词项的文本,开始和结束的位移以及类型
Lucene将写入索引的所有信息组织成倒排索引的结构——将词项映射到文档的数据结构。倒排索引面向词项,而不是文档。
Lucene将文档中的数据转化为倒排索引的过程称为分析,文本分析由分析器执行,分析器由分词器(tokenizer)、过滤器(filter)和字符映射器组成
2、Elasticsearch涉及到的相关概念
-
Cluster/Node
Cluster——搜索服务集群,Node——组成Cluster集群的节点
Node分:IndexNode(提供读写)、DataNode(提供数据存储和访问,负载均衡)
Node节点之间的关系对等(去中心化)。Master节点仅多了维护集群状态的功能。
Node节点的集群状态数据都是实时同步的。Master节点崩溃,其他Node节点会被选举为新的Master节点。 -
Shards 分片
Elasticsearch将数据散步到多个物理Lucene索引上,这些Lucene索引称为分片(shard),而散步这些分片的过程叫做分片处理。Elasticsearch会自动完成分片处理,并且让这些分片呈现出一个大索引的样子。分片索引的数量在索引创建时候就配置好了,后续无法改变。
-
Replicas
索引的冗余备份,防止数据丢失或者用于负载均衡
-
Recovery
在节点加入,或者退出集群Cluster,或者故障重启时,Elasticsearch根据机器负载情况,对索引分片(shards)进行重新分配。
-
Gateway
Elasticsearch索引数据快照的存储方式,当Elasticsearch集群关闭再重启时,就会从Gateway中读取索引数据快照。
-
Discovery.zen
Elasticsearch的自动发现节点机制,Zen:用来实现节点自动发现和Master节点选举,Master节点负责处理节点的加入和退出以及分片(shards)的重新分配。
-
Index 、Type 、Document 、Field
Index:
Elasticsearch存储数据的地方,可以快速高效的对索引中的数据进行全文检索,类似于数据库中的DataBase,一个Index下一般对应多个Typetype:
类似于Database中的Table,用来存放具体数据Document :
类似于关系型数据库中的数据行,每一个Type都有一个唯一的Id作为区分。数据插入的时候,可以指定Id值,也可以不指定ES默认生成。Field :
类似关系数据库中的某一列,是Elastic数据存储最小单位
3、Elasticsearch工作流程
-
启动过程
当Elasticsearch节点启动时,它使用广播技术发现同一个集群中的其他节点(node)并建立连接,集群中会有一个节点被选为管理节点(master node),master节点负责集群状态管理,以及就能变化时做出反应,分发索引分片至集群的相应节点上。
-
故障检测
集群正常工作时,master节点会监控所有可用节点,如果任何一个节点在预定义的时间内没有响应,则认为该节点已经断开。那么在集群-分片之间需要重新平衡。
如果断开的是主节点,那么集群会重新选举出一个Master Node,然后再进行集群-分片平衡操作。 -
索引建立过程
索引建立操作只会发生在主分片上,不会发生在副本上。客户端发送建立索引的请求——ES集群某一个Node接收到了这个请求——Node检测自身有没有对应的主分片——没有主分片或者只有副本,那么请求会被转发到有主分片的Node节点。
-
查询数据过程
查询分为两个阶段:分片阶段和合并阶段,分片阶段将query分发到包含相关文件的分片中执行查询,合并阶段则从众多分片中收集返回结果,对结果进行合并,排序,后续处理然后返回给客户端(可视为返回的文档)。
4、Kibana可视化操作
-
kibana建立索引
索引建立后,索引设置不允许修改。未设置的值,ES默认系统默认值。
#建立test_idx_e索引,五个分区分片,1个冗余索引备份(副本数) PUT test_idx_e { "settings":{ "index":{ "number_of_shards":5, "number_of_replicas":1 # "blocks.read_only":true 当前索引只允许读,不允许写,或者更新 # "blocks.read":true 当前索引禁止读取 # "blocks.write":true 当前索引禁止写操作 # "blocks.metadata":true 禁止对metadata操作 } } } #查看建立的索引信息 GET test_idx_e/_settings #查看指定索引文件的状态信息 GET test_idx_e/_stats
_stats字段:
docs: 被索引文档信息,count值表示描述的索引中的文档数量
store: 索引的大小
indexing: 索引的操作信息
get: 实时获取操作信息
search: 搜索操作信息 -
Kibana 对数据增、删、改、查
自定义ID插入的PUT语句执行时,ID对应记录存在则修改,不存在新增
#test_idx_e索引test_tpe_e类型下,新增id为id_a的数据——指定id值 PUT test_idx_e/test_tpe_e/id_a { "username":"张三", "age":18, "address":"xxx省xx市区" } #查询上面插入的数据信息 GET test_idx_e/test_tpe_e/id_a #修改插入的信息 PUT test_idx_e/test_tpe_e/id_a { "username":"张三123", "age":18, "address":"xxx省xx市区", "married":true } #删除插入的数据信息 DELETE test_idx_e/test_tpe_e/id_a #---------系统默认id插入 POST test_idx_e/test_tpe_e/ { "username":"张三12", "age":18, "address":"xxx省xx市区", "married":true }