相似度算法

涉及到了ES的底层,首先讲一下ES的底层核心,相似度模型,ES的查询和传统的数据库查询最大的差别就在相似度查询(之前讲过,索引存储的最大差别就是讲非结构化数据转化为结构化),ES里面会给文档的相似度打分。那么这种打分的算法就是ES的查询的核心,默认的算法是TF/IDF,除了这个默认的算法之外还有很多其他的算法,罗列一下,当你发现现在的查询速度以及效率不满足需要的时候,可以考虑一下下面的算法:

Okapi BM25:适用场景是短文档;

Divergence from randomness (DFR):处理自然语言的相似度处理;

Information-based:同上;

LM Dirichlet:自己看吧:https://lucene.apache.org/core/4_9_0/core/org/apache/lucene/search/similarities/LMDirichletSimilarity.

LM Jelinek Mercer:https://lucene.apache.org/core/4_9_0/core/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.Note

ES的存储类型

下面是ES的存储方式:

Simple:尽是用于兼容,早期的基于bio的存储模式;

Niofs:基于NIO读写,默认;

Mmap:mapping映射,硬盘数据映射到到内存的虚拟地址;而且MMap只是是用于32bit机器,64bit机器不适用。

fs:是默认选项,会自动识别各个操作系统以及位数下应该采用哪种存储模式。早期版本名称是default_fs。

Mem(已经废弃):(es2.x之后已经移除)内存保存,如果数据存活时间不长,或者数据量不是特别的,采用内存放置,提高查询、检索效率;

事务日志和Searcher

介绍一下ES的索引查询的全流程:

创建索引就不讲了,前面都已经介绍了,包括路由策略等;

提交(Post)了一个文档,首先是提交到了事务日志,事务日志将会将此次提交持久化,主要是可追溯,一旦写入ES失败,可以通过事务日志来进行恢复,另外也避免过于频繁写入ES导致了ES所在主机的IO压力过大;然后事务日志将会定时把数据刷新到ES里面;

这个时候,还有一个对象出现就是searcher,这个货主要就是定时获取ES里面的元数据,通过searcher可以定位到查询文档的位置,我们通常使用/_search?pretty的方式进行查询就是通过访问searcher来进行查询的,因为search是定时刷新的(默认1s),所以searcher的数据是有延迟,可能不会瞬间将最新数据查到;不过还有一种方式就是直接通过指定文档ID的方式/index/docmentId?pretty,这种方式的查询不走searcher,而是综合了事务日志以及ES里面的数据;但是因为牵涉到了两部分的数据,所以如果对于实时性要求不高,但是希望快点可以使用search查询,反之则使用search。

发现是不是和HBase非常想,HBase也是client提交后先入WAL,然后刷到memstore中,最后才入HDFS,查询也是会从memstore以及HDFS中进行联合查询。

索引合并

索引合并(merge),好处就是加快检索,对于多个小文件的检索是比少量比较大的检索要慢的,所以索引是要合并的,同时还要保证不能合并的太大。当然代价就是I/O操作。合并调度,ES里面的调度分为两种顺序和并发,默认是采用并发,顺序这种模式,你就不用知道了。

IO控制

IO控制,ES是读写高频的应用,所以ES里面有对于IO限流一些配置,首先是指定限流配置应用范围,none(无限制),merge(只有索引合并限制),all(所有的操作都限制);之后ES里面可以针对最大吞吐量之类的属性进行限制。

ES缓存策略

接下来讲一下ES的缓存策略,ES高效海量数据查询一直是它的一个亮点,其中一个原因是因为ES的缓存机制很好。

过滤缓存,就是filtered的缓存,这个就不多说了,只要指定了filter,就可以对其进行缓存;过滤缓存也是有两个级别,索引级别的缓存以及节点级别缓存,一般推荐使用节点缓存;因为数据的落点不可知或者说不定(比如文档保存索引的分片和副本多是不可预知的);不过看了ES master 5.X的版本,已经不再提及索引级别的缓存,只提到了节点级别的缓存。

字段数据缓存(基本废弃),这类缓存只是针对非倒排索引的查询,比如聚合,脚本计算以及排序等,可以通过指定缓存字段来减少换存量,可以通过核定eager来对数据进行提前加载,即只要探测到有数据变化,就提前加载查询数据,保持数据新鲜度。但是要知道,docValue的处理效率已经和字段数据缓存很接近,而且不占用内存(仅需要少量的堆内存);另外到了ES5.0之后,你基本可以忽略字段数据缓存,因为ES会为每一个not_ analyzed字段(keyword type)指定docValues;如果想要对于非string的字段使用docValues,如下:

查询分片缓存,这个则是对于倒排索引数据进行缓存,前面两类都是基于非倒排索引,分片缓存则是基于倒排索引(需要对文档进行评分)的查询的缓存。

字段回路器,就是预判,如果某次查询使用内存量大于预设的阈值,将会拒绝此次此次查询,默认是达到70%的JVM堆内存。

缓存缓存最后一点就是清楚缓存,可以指定全部清空:

curl -XPOST 'localhost:9200/_cache/clear'

也可以指定索引进行清空:

curl -XPOST 'localhost:9200/mastering/_cache/clear'

curl -XPOST 'localhost:9200/mastering,books/_cache/clear'

还可以指定某类缓存清空:

curl -XPOST 'localhost:9200/mastering/_cache/clear?field_data=true&filter=false&query_cache=false'

 

ElasticSearch(六)底层索引控制的更多相关文章

  1. ElasticSearch优化系列六:索引过程

    大家可能会遇到索引数据比较慢的过程.其实明白索引的原理就可以有针对性的进行优化.ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡. ...

  2. Elasticsearch 关键字:索引,类型,字段,索引状态,mapping,文档

    1. 索引(_index)索引:说的就是数据库的名字.我这个说法是对应到咱经常使用的数据库. 结合es的插件 head 来看. 可以看到,我这个地方,就有这么几个索引,索引就是数据库,后面是这个数据库 ...

  3. elasticsearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  4. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  5. Elasticsearch 之 数据索引

    对于提供全文检索的工具来说,索引时一个关键的过程——只有通过索引操作,才能对数据进行分析存储.创建倒排索引,从而让使用者查询到相关的信息. 本篇就ES的数据索引操作相关的内容展开: 更多内容参考:El ...

  6. iOS开发Swift篇—(六)流程控制

    iOS开发Swift篇—(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...

  7. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  8. ElasticSearch创建动态索引

    ElasticSearch创建动态索引 需求:某实例需要按照月份来维护,所以之前的“写死”索引的方式当然不行了.通过百度和看SpringDataElasticSearch官方文档,最后解决了这个问题. ...

  9. elasticsearch 内部对象结构数据索引

    内部对象 经常用于 嵌入一个实体或对象到其它对象中.例如,与其在 tweet 文档中包含 user_name 和 user_id 域,我们也可以这样写: { "tweet": &q ...

随机推荐

  1. shell脚本实例-脚本批量创建用户

    #!/usr/bin/bash read -p "Please input number: " num if [[ ! "$num" =~ ^[0-9]+$ | ...

  2. Python 再次改进版通过队列实现一个生产者消费者模型

    import time from multiprocessing import Process,Queue #生产者 def producer(q): for i in range(10): time ...

  3. c++ 编译报错汇总(随时更新)

    1.invalid new-expression of abstract class type ‘×××ב 这个报错代表一个尝试在实例化一个抽象类,也就是说父类的接口中有纯虚函数在子类中没有实现: ...

  4. GCC内置函数

    在C语言写的程序中,有时候没有包含头文件,直接调用一些函数,如printf,也不会报错,因为GCC内置和一些函数.如果包含了头文件,则去第三方库中链接这个函数,不再使用GCC内置的函数.每个编译器的内 ...

  5. ORB(oriented FAST and rotated BRIEF)特征提取与检测

    ORB采取FAST算法检测特征点,采取BRIEF算法计算特征点描述子. 1.检测特征点 检测候选特征点周围一圈的像素值,若有足够多的像素值与候选特征点的差异都较大,则认为该候选特征点是特征点. 对于上 ...

  6. Arcgis API for JS——打印控件乱码

    在通过Arcgis API for JS编写打印控件进行地图下载时,总发现地图字体乱码,如下图: 解决方法: 在装有ArcGIS Server,要调用服务的电脑或服务器上找到下图文件夹

  7. HDU4328 Cut the cake(动规:最大子矩形问题/悬线法)

    题目链接:传送门 题目大意: 给出N*M的字符矩阵(由字符B/R组成),求符合下图条件的子矩阵的最大周长. 1 ≤ N,M ≤ 1000. 思路: 悬线法. #include <iostream ...

  8. python开发day03

    一.常见的数据类型 1. int ==> 整数. 主要⽤用来进⾏行行数学运算  \ (常见的操作有+-*%) a.bit_length() a= # 10进制 二进制 100 print(a.b ...

  9. HDU 1875:畅通工程再续(最小生成树)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  10. Django ---- blog项目学习所得

    一.登录功能 1.采用ajax 提交form表单的方式 2.后台生成随机验证码,登录时提交验证码 3.用PLI库生成随机验证码,置于session中,登录时与前台提交的code进行upeer()的验证 ...