elasticsearch(弹性搜索).pptx
走近 elastic search 分享人 林云霞 概念解释Part 01 系统原理Part 02 分布式集群Part 03 应用场景Part 04 概念解释 01 概念解释 RESTful API full text search real time search and analytics engine Elasticsearch JSON over HTTP distributed Lucene based multi tenancy open - source hign availability scales massively schema free 概念解释 Elastic Search 是一个基于 Lucene 构建的开源,分布式, RESTful 搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可 靠,快速,安装使用方便。支持通过 HTTP 使用 JSON 进行数据索引 ,它能够 快速搜索数十亿的文件以及 PB 级的数据 ,结构化或者非结 构化的数据都可以。 简介 概念解释 节点 一个节点就是集群中的一个服务器 集群 点 多台 Es服务器的结合的统称叫 ES集群,一个集群包含多台服务器,多 个节点。 分片 主分片和副本分片 主分片 1 N 复制分片 概念解释 索引 中的索引是组织数据的逻辑空间,一个索引就是一个拥有几分相似特征 的文档的集合 类型 在一个索引中,你可以定义一种或多种类型 文档 一个文档是一个可被索引的基础信息单元 数据库 表 行 概念解释 索引 index 类型 type 文档 doc 1 N 1 N 点此添加标题 集群 节点 主分片 副本分片 索引 概念解释 文档 概念解释 主节点 控制集群,负责集群中的操作,协调创建索引、查询请求 客户端节点 负载 均衡,组装返回的数据给客户端 节点类型 对应节 点 相关配置 主 节 点 Node1 node.mastertrue 数据 节 点 Node2 node.datetrue 客 户 端 节 点 Node3 node.datafalse; node.masterfalse 集群中有很多结点,可以配置为 3种不同的角色 系统原理 02 系统原理 Elasticsearch使用了 Apache Lucene,其内部使用的是被称为倒 排索引的数据结构。 存储模型 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引 表中的每一项都包括一个属性值和具有该属性值的各记录的地址。 由 于不是由记录来确定属性值,而是由属性值来确定记录的位置 ,因而 称为倒排索引 inverted index。 倒排索引 系统原理 文档是 Elasticsearch的数据单位,对文档中的词项进行 分词 ,并创建 去重词项 的有序列表,将 词项 与其在 文档中出现的位置 列表关联,便 形成了倒排 索 引。 我们来看下如下 2个文档是如何被倒排索引的 文档 1Doc 1 零售应用开发一室主题分享 文档 2Doc 2 数据仓库团队主题分享 文档 1Doc 1 零售 /应用 /开发 /一室 /主题 /分享 文档 2Doc 2 数据 /仓库 /团队 /主题 /分享 系统原理 倒排索引 词项 文档 零售 doc1 应 用 doc1 开 发 doc1 一室 doc1 主 题 doc1、 doc2 分享 doc1、 doc2 数据 doc2 仓库 doc2 团队 doc2 文档 1Doc 1 零售 /应用 /开发 /一室 /主题 /分享 文档 2Doc 2 数据 /仓库 /团队 /主题 /分享 系统原理 当我们查询 “ 数据分享 ” 这一个中文分词时,只需要知道他在哪个文 档即可。 Terms doc1 doc2 数据 X 分享 x X SCORE相关度) 1 2 两个文档都匹配,但是 DOC2比其它的有更多的匹配项。相关度评 分为 2,如果我们加入简单的相似度算法 similarityAndlgorithm,计 算匹配单词的数目,这样我们就可以说 DOC2这个 文档比其它的匹配 度更高,这对于我们的查询结果具有更多相关性。 系统原理 当我们发送索引一个新文档的请求到协调节点后,将发生如下一组操作 Elasticsearch集群中的每个节点都包含了改节点上分片的元数据信息。协调 节点 默认 使用文档 ID参与计算,以便为路由提供合适的分片。 Elasticsearch使用 MurMurHash3函数对文档 ID进行哈希,其结果再对分片 数量取模,得到的结果即是索引文档的分片。 shard hashdocument_id num_of_primary_shards 新建索引 系统原理 coordinating node shard memory builder translog filesystem cache empoty translog disk write request route request refresh every 1 sec every 30 min or when gets too big commit when every 5 sec with every write operation and when ed commit to dish with translog inside a shard 添加标题 post http//localhost9200/blog/newarticle/1 { “author““林云霞 “, “creatDate““20170729“, “content““elastic search 是一个非常优秀 的搜索引擎 “, “place““招银网络科技 “ } 新建索引 { “_index“ “blog“, “_type“ “newarticle“, “_id“ “1“, “_version“ 1, “result“ “created“, “_shards“ { “total“ 3, “successful“ 2, “failed“ 0 }, “created“ true } 系统原理 删除 磁盘上的每个段都有一个相应的 .del文件。当删除请求发送后,文档并没有 真的被删除,而是在 .del文件中被标记为删除。该文档依然能匹配查询,但 是会在结果中被过滤掉。当段合并 我们将在本系列接下来的文章中讲到 时 ,在 .del文件中被标记为删除的文档将不会被写入新段。 更新 接下来我们看更新是如何工作的。在新的文档被创建时, Elasticsearch会为 该文档指定一个版本号。当执行更新时,旧版本的文档在 .del文件中被标记 为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询, 但是会在结果中被过滤掉。 更新和删除 添加标题 post http//localhost9200/blog/newarticle/1 { “author““林云霞 “, “creatDate““20170729“, “content““简单介绍 elastic search的基本 原理 “, “place““招银网络科技 “, “updateDate““20170804“ } 更新 { “_index“ “blog“, “_type“ “newarticle“, “_id“ “1“, “_version“ 2, “result“ “updated“, “_shards“ { “total“ 3, “successful“ 2, “failed“ 0 }, “created“ false } 添加标题 delete http//localhost9200/blog/newarticle/1 删除 { “found“ true, “_index“ “blog“, “_type“ “newarticle“, “_id“ “1“, “_version“ 3, “result“ “deleted“, “_shards“ { “total“ 3, “successful“ 2, “failed“ 0 } } 系统原理 查询阶段 查协调节点向索引中的每个分片(原本或副本)广播。每个分片在本 地执行搜索并且建立了匹配 document的优先队列( priority queue) 并将 document IDs 返回协调节点 取回阶段 协调节点将向包含原始文档的分片发起请求。全部分片填充文档信息 并将其返回给协调节点。 查询 系统原理 search request Priority queue Priority queue Priority queue Priority queue query phase send request to all shards create a priority queue to globally sort results returned by shards fetch phase request documents to returned to the client from individual shards fetch phase return documents request by the coordinating node after enriching them query phase each shards pers search locally create a priority queue of size fromsize and sorts results by relevance send document IDs and scores of matching documents to the coordinating node coordinating node shard shard shard 添加标题 get http//localhost9200/blog/newarticle/1 查询 { “_index“ “blog“, “_type“ “newarticle“, “_id“ “1“, “_version“ 2, “found“ true, “_source“ { “author“ “林云霞 “, “creatDate“ “20170729“, “content“ “基本原理了已经介绍完 了 “, “place“ “招银网络科技 “, “updateDate“ “20170804“ } } 分布式集群 03 分布式集群 空集群 分布式集群 http//localhost9200/_cluster/health { “cluster_name“ “my-application“, “status“ “green“, “timed_out“ false, “number_of_nodes“ 1, “number_of_data_nodes“ 1, “active_primary_shards“ 0, “active_shards“ 0, “relocating_shards“ 0, “initializing_shards“ 0, “unassigned_shards“ 0, “delayed_unassigned_shards“ 0, “number_of_pending_tasks“ 0, “number_of_in_flight_fetch“ 0, “task_max_waiting_in_queue_millis“ 0, “active_shards_percent_as_number“ 100 } 集群健康 颜色 意义 green 所有主要分片和复制分片都可用 yellow 所有主要分片可用,但不是所有 复制分片都可用 red 不是所有的主要分片都可用 分布式集群 http//localhost9200/blog { “settings“ { “number_of_shards“ 3, “number_of_replicas“ 1 } } 添加索引 分布式集群 添加索引 分布式集群 故障转移 分布式集群 随着应用需求的增长,我们该如何扩展如果我们启动第三个节点 ,我们的集群会自我感知,这时便成为了三节点集群 横向扩展 分布式集群 http//localhost9200/blog/_settings {“number_of_replicas“ 2} 更多扩展 分布式集群 我们已经说过 Elasticsearch可以应对节点失效,所以让我们继续 尝试。如果我们杀掉第一个节点的进程(以下简称杀掉节 点),看起 来像如此 应对故障 应用场景 04 应用场景 场景 使用 Elasticsearch作为主要的后端 应用场景 场景二在现有系统中增加 elasticsearch 应用场景 例如,假设要部署一个大规模的日志框架存储,搜索,并分析了大 量的事件。 场景三使用 elasticsearch和现有的工具 应用场景 1、 Wikipedia(维基百科)使用 ES提供全文搜索并高亮关键字 2、 StackOverflow( IT问答网站)结合全文搜索与地理位置查询 3、 Github 使用 Elasticsearch 搜索 20TB 的数据,包括 13 亿的文件 和 1300 亿行的代码 4、 Mozilla 5、 Sony 公司使用 elasticsearch 作为信息搜索引擎 国外应用示例 应用场景 百度(在云分析、网盟、预测、文库、钱包、风控等业务上都应用 了 ES,单集群每天导入 30TB数据,总共每天 60TB)、新浪 、阿里 巴巴、腾讯等公司均有对 ES的使用 国内使用案例 谢谢