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