概述
接上一篇《ElasticSearch 学习笔记(二)-----Elasticsearch的简介以及应用》,这篇,我们来学习ElasticSearch中的两个重要知识点,设计原理与分词器。
设计原理
1.一个节点Node 运行着ES的实例,一个集群由一个或多个使用着同样名字(cluster.name)的节点组成,分享数据和负载。当Node 从集群中添加或者删除时,集群会重组自己,使数据平摊的更加均匀。
2.集群中需要一台master节点。master节点的左右就是掌管集群的管理工作,例如创建和删除索引。
创建一个索引 - index,shard, cluster
3.将数据添加到ES的前提是,我们需要一个索引(名词)index----一个存储与这个索引相对应数据的地方。实际上,index 仅仅只是一个命名空间来指向一个或多个实际的物理分片(shard)
4.一个分片(shard)是一个比较底层的工作单元来处理这个索引(index)的所有数据的一个切片(slice)。一个shard实际上是一个Lucene实例,在它的能力范围内拥有完整的搜索功能。我们所有文档的索引indexed(动词) 和存储工作都是在shard上,但这是透明的,我们不需要直接和shard通信。而是和我们创建的index(名词)通信。shards 是ES将数据分布式在你的集群的关键,想象下shards是数据的容器,文档存储在shards里,而shards被分配在集群的每一个节点Node里,当你的集群规模增长和降低时,ES会自动的在Node间迁移shards 以保持集群的负载均衡
应用场景
1.海量数据分析引擎
2.站内搜索引擎
3.数据仓库
分词器
分词器选择
ES 默认的分词器对中文的支持很不好,如下图所展示的默认分词器对美国留给伊拉克的是个烂摊子吗
的分词结果:
从上图,我们可以看出默认的分词器对中文的支持不够好,其是按照空格来进行分词的。所以,我们需要选用一种能很好支持中文分词的分词器。中文分词我们通常选用IK分词器,以下是一款开源的ik分词器:
https://github.com/medcl/elasticsearch-analysis-ik
安装ik分词器
此处我们的ES版本为6.4.3,安装readme的说明,所以我们选用的分词器也为6.4.3版本
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik
安装之后重启ES,然后,测试下ik 分词器对美国留给伊拉克的是个烂摊子吗
的分词效果。
集群状态说明
绿色,绿色表示ES集群处于完全健康的状态,所有主分片和副本分片都正常可用
黄色,黄色表示所有主分片可用,但是部分副本分片不可用
红色,表示部分主分片不可用,这种情况下最好对故障进行排除。
如果集群状态为红色,Head插件显示:集群健康值red。则说明:至少一个主分片分配失败。这将导致一些数据以及索引的某些部分不再可用。 尽管如此, ElasticSearch还是允许我们执行查询,至于是通知用户查询结果可能不完整还是挂起查询,则由应用构建者来决定。
基本用法-restful API
基本的restful API 有如下功能:
1.管理功能
1.1. 检查集群状态,节点状态,索引的状态以及相关统计数据
1.2. 管理集群、节点、索引数据以及源数据
2.维护索引
2.1.基本操作
提供针对索引的基本CURD操作(Create【PUT】, Read【GET】, Update【POST】, and Delete【POST】)。
2.2. 高级操作
提供分页,排序,过滤等高级操作。
操作示例
1.检查集群状态
curl localhost:9200/_cat/health?v
2.检查节点状态
curl localhost:9200/_cat/nodes?v
3.查询所有索引
curl localhost:9200/_cat/indices?v
postman的操作示例详细参见:
https://download.csdn.net/download/u014534808/10991675
部分细节说明:
- 地址栏中的变量设置,如下图中的eshost变量,我们可以在设置中增加一个环境变量。
2. 创建结构化索引
如上图所示,{{eshost}}/title 表示创建一个名称为 title 的索引,其属性有titleid,titlename,description,createTime。 其中属性的 type 表示匹配类型, keyword 表示关键字全匹配, text 表示模糊匹配。运行后的结果是:
3. 给索引插入数据
按照json 的数据格式,插入数据,插入后的结果如下:
4. 查询索引数据
我们用以下数据作为查询数据,看看查询结果
返回结果说明:
总共查询了5个分片区,匹配到了两条记录。其中_score表示匹配度,匹配度越高,_score 值也就越大,其是根据description属性来匹配的。hits 里表示匹配到的结果,这个等同于 lucene 中的hits。
{ "took": 11, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 2.1216555, "hits": [ { "_index": "title", "_type": "_doc", "_id": "1", "_score": 2.1216555, "_source": { "titleid": "12", "titlename": "这是一篇好文章", "description": "今天是个好日子,又在家里宅了一天", "createTime": "2019-03-04 21:18:18" } }, { "_index": "title", "_type": "_doc", "_id": "2", "_score": 2.0137746, "_source": { "description": "今天是个好日子,所以要出去走走", "titlename": "美好的一天" } } ] } }
总结
本文我们先介绍了ElasticSearch的设计原理,以及其应用场景。接着,我们介绍了一款标准的中文分词器,最后,我们介绍了基本ES 中基本的restful API, 并通过postman
参考文献
ElasticSearch原理简介进行了测试。