赞
踩
倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。区别于传统的正向索引,倒排索引会再存储数据时将关键词和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数
据即可。Elasticsearch 使用一种称为倒排索引的结构,ES中的倒排索引其实就是 lucene 的倒排索引,它适用于快速的全文搜索。正向索引(forward index),就是搜索引擎会将待搜索的文件都对应一个文件 ID,搜索时将这个ID 和搜索关键字进行对应,形成 K-V 对,然后对关键字进行统计计数。但是互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为反向索引(inverted index,倒排索引),即把文件ID对应到关键词的映射,转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,并保存到倒排表中,查询时会将内容进行分词后在倒排表中进行查询,最后匹配数据即可。这些文件中都出现这个关键词。
集群:是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索
引和搜索功能。集群由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设
置为按名称加入群集,则该节点只能是集群的一部分。
节点:属于集群一部分的单个服务器。它存储数据并参与群集索引和搜索功能。
索引:就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一
个或多个主分片,并且可以有零个或多个副本分片。 MySQL =>数据库 Elasticsearch =>索引
文档:类似于关系数据库中的一行。不同之处在于索引中的每个文档可以具有不同的结构(字段),但
是对于通用字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows
Elasticsearch => Indices => Types =>具有属性的文档
类型:是索引的逻辑类别/分区,其语义完全取决于用户。
在 Elasticsearch 和磁盘之间是文件系统缓存。在内存索引缓冲区中的文档会被写入到一个新的段中。 但是这里新段会被先写入到文件系统缓存,这一步代价会比较低,稍后再被刷写到磁盘—这一步代价比较高。不过只要文件已经在缓存中,就可以像其它文件一样被打开和读取了。在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次,即刷新文件系统缓存。这就是为什么我们说 Elasticsearch 是 近实时搜索:文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。这些行为可能会对新用户造成困惑:他们索引了一个文档然后尝试搜索它,但却没有搜到。这个问题的解决办法是用 refresh API 执行一次手动刷新:/users/_refresh。
并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件,你可能想优化索引速度而不是近实时搜索, 可以通过设置 refresh_interval , 降低每个索引的刷新频率。refresh_interval 可以在既存索引上进行动态更新。 在生产环境中,当你正在建立一个大的新索引时,可以先关闭自动刷新,待开始使用该索引时,再把它们调回来。
# 关闭自动刷新
PUT /users/_settings
{ "refresh_interval": -1 }
# 每一秒刷新
PUT /users/_settings
{ "refresh_interval": "1s" }
常用字典数据结构
排序列表Array/List:使用二分法查找,不平衡
HashMap/TreeMap:性能高,内存消耗大,几乎是原始数据的三倍
Skip List 跳跃表:可快速查找词语,在lucene、redis、Hbase等均有实现。相对于TreeMap等结构,特别
适合高并发场景(Skip List介绍)
Trie:适合英文词典,如果系统中存在大量字符串且这些字符串基本没有公共前级,则相应的trie树将非常消耗内存(数据结构之trie树)
Double Array Trie:适合做中文词典,内存占用小。很多分词工具均采用此种算法(深入双数组Trie)
Ternary Search Tree 三叉树:每一个node有3个节点,兼具省空间和查询快的优点(Ternary Search Tree)
Finite State Transducers(FST) :一种有限状态转移机,Lucene4有开源实现,并大量使用
字典树又称单词查找树,Trie 树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排
序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:
利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高(空间换时间)。
对于中文的字典树,每个节点的子节点用一个哈希表存储,这样就不用浪费太大的空间,而且查询速度上
可以保留哈希的复杂度 O(1)。
首先客户端向集群发出索引文档的请求,它会选择任何一个节点,这个节点当接收到请求后会根据路由算法找到应该放的那个主分片的位置,从而索引数据,之后为了保证数据的完整性,它会将它的副本数据进行同步,同步完成后客户端就可以进行访问了。细节方面:
用户的索引请求发过来之后,首先协调结点默认使用文档ID参与哈希计算(也支持通过routing),shard = hash(document_id) % (num_of_primary_shards),即分片位置索引 = 将文档ID或路由ID进行哈希计算后的值 % 所有分片总数。随后会在内存(memory)中建立一个索引(Index),这个Index会在内存中形成一个分段对象(Segment),为了防止数据出现问题,会同时在索引数据之后写入到日志(Translog)当中,在此过程中,每隔1秒钟,会向Segment会将数据刷新到系统文件缓存区(OS Cache),以方便接收用户的查询,因为如果让用户查询直接访问内存或磁盘,会使速度变慢。当过了30分钟或者Translog中的数据超过了512M,Os Cache中的Segment会将数据刷写(flush)到磁盘当中,刷写后内存中的缓冲将被清除。此时一旦刷写的数据比较多了的话(磁盘中有多个Segment),磁盘就会将这些分段进行合并。
“脑裂”问题可能的成因:(有两个master)
脑裂问题解决方案
该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值,
且备选主节点中有该参数个节点认为主节点挂了,进行选举。官方建议为(n/2)+1,n 为主节点个数
(即有资格成为主节点的节点个数)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。