Elasticsearch

elasticsearch
– 用于将导入数据建立动态倒排索引,建立磁盘缓存,提供磁盘同步控制,达到准实时检索
• Elasticsearch数据流向
– 动态更新lucene索引,规则:新收到的数据写入到新的索引文件里面
• 步骤:
– 每次生成的倒排索引叫一个段(segment)然后另外使用一个commit文件记录索引内
所有的segment,生成segment的数据来源是内存buffer
默认每隔一秒刷一次到文件系统缓存,文件系统缓存再到磁盘,可以调用/_refresh手动刷新
既然每隔一秒只是写到文件系统缓存,辣么最后一步写到实际磁盘
是什么来控制的?如果中间出现主机错误、硬件故障等异常,数据会不会丢失呢?
Translog提供磁盘同步控制
– 数据写入内存buffer同时记录了一个translog日志

Translog提供磁盘同步控制
– 等到commit文件更新的时候,translog才清空,这一步叫做flush,默认每半小时刷新
一次,也可以手动调用
– 也可以通过配置index.translog.flush_threshold_ops参数,控制每多少条刷新一次
Segment merge
– 独立线程做merge工作
Segment merge
– 可以通过indices.store.throttle.max_bytes_per_sec设置调整速度限制,比如SSD可
以调整到100mb
– 线程数公式Math.min(3,Runtime.getRuntime().availableProcessors()/2)
– 也可以调整index.merge.scheduler.max_thread_count来配置
Elasticsearch XPUT

动态修改配置
Curl –XPUT http://127.0.0.1:9200/_cluster/settings -d ‘
{
“persistent”:{
“indices.store.throttle.max_bytes_per_sec”: “100mb”
}
}’
• Elasticsearch路由计算
• Shard = hash(routing)% number_of_primary_shards
• 分片依赖分母,所以主分片数不能改变,否则索引读不了
附注:

正排索引(正向索引)
正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
正排表结构如图1所示,这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。

倒排索引(反向索引)
倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。
倒排表的结构图如图2:

正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)。
建立索引

一般分成三种方式:

3.1.两遍文档遍历方法(2-Pass In-Memory Inversion)

这种方式完全是依赖内存的。第一遍扫描所有文档,计算每个单词的tf,然后计算所有单词tf的总和,这个总和值直接关系到最终索引所需的内存大小。在内存中,建立有序数组用来存储单词,建立一块连续的存储空间(由tf总和控制)用来存储倒排索引,并且每个单词通过“指针”指向其对应的倒排列表其实位置。第二遍扫描就是建立每个单词的倒排列表信息。当所有文档扫面结束后,再以某种方式存储起来。

这种方式的缺点是:1)两遍扫描,效率低下;2)完全依赖内存,对规模大点的文档集无能为力;3)不支持动态更新索引。

3.2.排序法(Sort-based Inversion)

为了解决两遍文档遍历方法的缺陷,排序法只在内存中开辟固定大小的空间用来建立索引,当空间消耗光时将其写入磁盘,然后清空内存空间对其他文档进行索引,直至索引完全部文档。排序法将单词全部存储在内存中,并且不停收集倒排项(倒排项包括:单词id,文档id,单词频率等信息),当空间消耗光时,对所有的倒排项按照单词id、文档id进行排序,排序好后将其写入临时文件。此时清空倒排项所占用的内存空间,然后重复上述工作。注意单词id是事先排好序的。在一开始,我们不会将全部的单词加载进入内存,是在遍历的过程中文档中出现了才加入内存。因此随着遍历,单词所占用的空间越来越大,倒排项所占用的空间越来越小,也就是说越到后面一次遍历的文档数量就越少,临时文件也就越小。

当遍历完整个文档集后,我们便得到了一堆的临时文件(存储了倒排项),接下来就要将这些文件进行“整合”。由于这些倒排项都排好序了,因此这个工作相对简单,就是将同一个单词的倒排项进行合并。

3.3.归并法(Merge-based Inversion)

排序法最致命的一个问题就是将全部单词放到内存里,如果单词量特别大,以至于内存放不下那就望尘莫及了!归并法可以很好的解决这个问题,归并法也在内存中开辟一块固定大小的空间,对于一篇文档就将其转换成标准的内存倒排索引结构,假设在内存空间的限制下,将n篇文档建立好了单独的内存倒排索引结构,然后进行合并形成一个索引段,写入磁盘,清空内存。这里的内存索引、索引段只是在文档数量规模上有所区别,结构上完全一致。在这个过程中同样需要对单词进行排序,方便后期的合并。

当遍历完整个文档集合后,我们同样得到了一堆临时文件(索引段),和排序法类似,我们将同一单词的倒排列表进行合并即可。

lucene采用的就是这种方式。

4.动态索引

索引建立完成后,如果后期不需要对其进行调整(增、删),那么称之为静态索引,反之为动态索引。

动态索引又将牵涉到实时索引(实时检索)等问题,这里不展开描述实时的问题。

动态索引包含三个部分:磁盘索引文件、内存临时索引、已删除文档列表。

内存临时索引和归并法中的内存索引一个意思,将新加的文档临时放在内存中。以删除文档列表记录删除文档的id。检索时同时查询磁盘索引文件和内存临时索引,然后通过已删除文档列表进行过滤。当内存临时索引达到一定阈值时将其合并到磁盘索引文件。

5.索引更新策略

索引更新主要包括完全重新更新(Complete Re-build)和增量更新(再合并策略Re-Merge、原地更新策略In-Place)。lucene中使用的是Re-Merge策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值