Elasticsearch实战学习笔记系列 Elasticsearch深入功能
目录
Elasticsearch实战学习笔记系列 Elasticsearch深入功能
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据
Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索
Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系
一、Elasticsearch设计方式
1.逻辑设计
用于索引和搜索的基本单位是文挡,可以将其认为是关系数据库里的一行 。 文档以类型来分组,类型包含若干文档,类似表格包含若干行。最终,一个或多个类型存在于同一索引中, 索引是更大的容器,类似 SQL世界中的数据库 。
2.物理设计
Elasticsearch将每个索引划分为分片, 每份分片可以在集群中的不同服务器间迁移。 通常应用程序无须关心这些,因为无论 Elasticsearch是单台还是多台服务器,应用和 Elasticsearch 的交互基本保持不变。 但是开始管理集群的时候,就需要留心了。 原因是,物理设计的配置方式决定了集群的性能、可扩展性和可用性 。
二、理解逻辑设计: 文档、类型和索引
其中聚会索引 get-together 包含两种类型 : 活动( event)和分组( group)。 这些类型包含若干文档,如标记为1的文档,标签1是该文挡的 ID(字符串)
1. 文档(数据行)
Elasticsearch 是面向文档的,这意味着索引和搜索数据的最小单位是文档 ,在 Elasticsearch 中文档有几个重要的属性。
- 它是自我包含的。 一篇文档同时包含字段(如 name )和它们的取值(如Elasticsearch Denver)。
- 它可以是层次型的。 想象一下,文档中还包含新的文挡,一个字段的取值可以是简单的, 例如location 字段的取值可以是字符串 。字段还可以包含其他字段和取值,例如, “位置”字段可以同时包含城市和街道地址 。
- 它拥有灵活的结构。文档不依赖于预先定义的模式, 例如并非所有的活动需要“描述” 这个字段值,所以可以彻底忽略该字段 。 但是,活动可能需要新的字段,如“位置”的 维度和经度 。
Elasticsearch 中的文档是无模式的,也就是说并非所有的文档都需要拥有相同的字段,它们不是受限于同一个模式。 例如在所有信息完备之前就要使用组织者数据时,你可以彻底忽略位置数据 。
尽管可以随意添加和忽略字段,但是每个字段的类型确实很重要 : 某些是字符串,某些是整数。 Elasticsearch 保存宇段和类型之间的映射以及其他设置,这种映射具体到每个索引的每种类型。 这也是为什么在 Elasticsearch的术语中,类型有时也称为映射类型。
2.类型(表)
类型是文档的逻辑容器,类似于表格是行的容器。 在不同的类型中,最好放入不同结构(模 式)的文档。
每个类型中字段的定义称为映射 。 例如, name 宇段可以映射为 string。 而 location 中 的 geolocation 字段可以映射为 geo_point 类型
3.索引
索引是映射类型的容器。 一个Elasticsearch索引非常像关系型世界的数据库,是独立的大量文档集合。 每个索引存储在磁盘上的同组文件中,索引存储了所有映射类型的字段,还有一些设置。 例如, 每个索引有一个称为 refresh_interval 的设置,定义了新近索引的文档对于搜索可见的时间间隔。 从性能的角度来看,刷新操作的代价是非常昂贵的,这也是为什么更新只是偶尔进行。 默认是每秒更新一次,而不是每来一篇新的文档就更新一次。 如果看到 Elasticsearch被称为准实时的,就是指的这种刷新过程。
就像可以跨多个类型进行搜索一样,你可以跨多个索引进行搜索 。这使得组织文档的方式更为灵活。例如,既可以将聚会的活动和相关的博客帖子放入不同的索引,也可以将它们放入同一索引中的不同类型 。 某些方式比其他的方式更有效,取决于具体的使用案例
三、理解物理设计: 节点和分片
一个集群中多个节点是如何工作的,数据是如何被划分为分片和被复制的,在多个分片和副本分片上索引和搜索是如何进行的。默认情况下,每个索引由 5 个主要分片组成,而每份主要分片又有一个副本, 一共 10个分片。
1.创建拥有一个或多个节点的集群
一个节点是一个 Elasticsearch 的实例 。 在服务器上启动 Elasticsearch 之后,你就拥有了一个节点 。 如果在另 一 台服务器上启动 Elasticsearch,这就是另一个节点 。 甚至可以通 过启动多个Elasticsearch 进程,在同一台服务器上拥有多个节点,多个节点可以加入同一个集群。
- 有助于性能,因为 Elasticsearch有了更多的资源
- 有助于稳定性,如果每份分片至少有 1个副本分片,那么任何一个节点都可以宕机,而 Elastics巳arch依然可以进行服务,返回所有数据
- 可以连接集群中的任一节点并访问完整的数据集,就好像集群只有单独的一个节点
缺点 :必须确定节点之间能够足够快速地通信,并且不会产生大脑分裂
(1)当索引一篇文档时发生了什么
默认情况下,当索引一篇文挡的时候,
1.系统首先根据文档ID的散列值选择一个主分片,并将文档发送到该主分片。
2.然后文档被发送到该主分片的所有副本分片进行索引,副本分片和主分片之间保持数据的同步
3.数据同步使得副本分片可以服务于搜索请求,并在原有主分片无法访问时自动升级为主分片
(2)搜索索引时发生了什么
当搜索一个索引时,Elasticsearch需要在该索引的完整分片集合中进行查找。这些分片可以是主分片,也可以是副本分片,原因是对应的主分片和副本分片通常包含一样的文档。 Elasticsearch 在索引的主分片和l副本分片中进行搜索请求的负载均衡,使得副本分片对于搜索性能和容错都有所帮助。
2.理解主分片和副本分片
Elasticsearch所处理的最小单元是分片。一个分片是 Lucene 的索引 : 一个包含倒排索引的文件目录。所以一个 Elasticsearch的索引由多个 Lucene 的索引组成。
倒排索引的结构使得 Elasticsearch 在不扫描所有文档的情况下,就能告诉你哪些文档包含特定的词条
词条字典将每个词条和包含该词条的文档映射起来. 词频使得 Elasticsearch 可以快速地获取某篇文档中某个词条出现的次数 。这对于计算结果的相关性得分非常重要。 例如,如果搜索“denver”,包含多个“denver”的文档通常更为相关。 Elasticsearch 将给它们更高的得分,让它们出现在结果列表的更前面。
副本分片可以在运行的时候进行添加和移除,而主分片不可以
3.在集群中分发分片
随着越来越多的节点被添加到同 一个集群中,现有的分片将在所有的节点中进行负载均衡。在那些分片上的索引和搜索请求都可以从额外增加的节点中获益 。以这种方式进行扩展(在节点中加入更多节点)被称为水平扩展。 此方式增加更多节点,然后请求被分发到这些节点上,工作负载就被分摊了。水平扩展的另 一个替代方案是垂直扩展,这种方式为 Elasticsearch 的节点 增加更多硬件资源,可能是为虚拟机分配更多处理器,或是为物理机增加更多的内存。
4.分布式索引和搜索
搜索的时候,接受请求的节点将请求转发到一组包含所有数据的分片. Elasticsearch使用round-robin的轮询机制选择可用的分片(主分片或副本分片),并将搜索请求转发过去.Elasticsearch 然后从这些分片收集结果,将其聚集到单一的回复,然后将回复返回给客户端应用程序。
四、索引新数据
- 使用cURL和RESTAPI, 发送JSON文档让Elasticsearch进行索引,你将看到返回的JSON 应答。
- 如果索引 和类型尚不存在时, Elasticsearch是如何自动地创建文档所属的索引和类型 。
- 通过本书的源码索引额外的文档,这样你可以拥有一个用于搜索的数据集。
- 索引名称一get-together
- 类型名称一group
- 属性列表一name 和 organizer
- 属性选项一两个属性的 type 选项都是 string。
五、搜索并获取数据
搜索的三个重要组成部分
- 在哪里搜索
- 回复的内容
- 搜索什么以及如何搜索
1.在哪里搜索
为了在多个类型中搜索,使用逗号分隔的列表,同时在 group 和 event 类型 中 搜索,运行如下类似的命令
curl "localhost:9200/get together/group , event/_search\?q=elasticsearch&pretty"
多个索引中搜索,用逗号分隔它们
curl "localhost:9200/get- together , other-index/_search\?q=elasticsearch&pretty"
"在哪里搜索"的灵活性,允许你在多个索引和l类型中组织数据
2.回复的内容
(1)时间
其中 took字段告诉你 Elasticsearch花了多久处理请求, 时间单位是毫秒, 而 time out字段表示搜索请求是否超时。
"took":2,
"timed out":false
(2)分片
"shards":{
"total": 2,
"successful": 2,
"failed" : 0
}
因为你在一个拥有2份分片的索引中搜索.所有的分片都有返回,所以成功( successful )的值是 2,而失败( failed )的值是 0
(3)命中统计数
包含了匹配文挡的数组,你将看到匹配文档的总数,而且通过 max score 会看到这些匹配文档 的最高得分.
"total": 2,
"max score": 0.9066504
(4)结果文档
3.如何搜索
它可以翻译为运行一个类型为 query string 的查询 ,字符串内容是 "elasticsearch"
(1)设置查询的字符串选项
如果搜索"elasticsearch san Francisco"
获得同样结果的另一种方法是在查询字符串中指定字段和l操作符,”query": ”name:elasticsearch AND name:san AND name:francisco”
(2)选择合适的查询类型
如果在 name 字段中只查找“elasticsearch” 一个词, term 查询可能更快捷、更直接
curl 'localhost:9200/get-together/group/_search?pretty' -d '{
"query":{
"term": {
"name":"elasticsearch"
}
}
}'
(3)使用过滤器
查询返回的结果中,每个结果都有一个得分。 如果对得分不感兴趣,可以使用过滤查询来替代。对比相应的查询,过滤查询更为快速,而且更容易缓存。
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据