ElasticSearch核心概念

       ElasticSearch简称ES,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎,能够达到实时搜索,稳定,可靠,快速,安装使用方便。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎。本文介绍Elasticsearch的一些核心概念。

一.文档(Document)

1.ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位;
2.文档会被序列化成json格式,保存在es中。json数据由字段组成,每个字段都有对应的类型;
3.每个文档都有一个Unique ID,可以自己指定,也可由ES自动生成。

二.索引(Index)

1.索引是文档的容器,是一类文档的结合。Index体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用于定义文档的字段名和字段类型以及字段使用的Analyzer等。Mapping会把JSON文档映射成lucene所需要的扁平格式。
2.索引中的数据是分散在分片shard上的,shard体现了物理空间的概念,索引的Setting定义了索引中的数据的分布。
3.索引名字必须是全部小写,不能以下划线开头,不能包含逗号。

下图把ElasticSearch与我们熟悉的RDBMS进行了一下类比,方便理解。注意:ElasticSearch7.0之后一个index只能有一个type。

三.集群

       每个ElasticSearch节点启动后,默认就是一个master eligible节点,可以参加选主,有可能成为master节点。第一个节点启动时,会选举自己成为master节点。每个节点都保存了集群的状态,只有master节点才能修改集群的状态信息。集群状态(cluster state)维护了:所有节点的信息、所有索引及相关Mapping和Setting信息、分片的路由信息。

       我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。

四.分片(shard)

一个分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。一个分片就是一个运行的Lucene实例。
主分片(Primary Shard),用以解决数据水平扩展问题。通过主分片,可以将数据分布到多个节点上。主分片数在索引创建时指定,后续不允许修改,除非Reindex。
副本分片(Replica Shard)只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,以实现高可用,同时可以提供读请求。副本分片是可以动态调整的,增加副本数,可以提高服务的读取吞吐量。但副本分片设置过多,会降低集群的写入性能。

主分片数是在索引创建时预先设定的,并且事后无法更改,所以生产环境需要提前做好容量规划。
分片数设置过小,会使后续无法增加节点实现水平扩展,同时可能导致单个分片的数据量过大。
分片数设置过大,则影响搜素结果的相关性打分,影响统计结果的准确性。同时单个节点上过多的分片,会导致资源浪费,也会影响性能。

当集群中某个节点宕机,集群将其它节点上的对应副本分片升级为主分片,并尽量重新分配丢失的复制分片。

五.倒排索引

倒排索引其实是Lucene的概念,包含两个部分:单词词典、倒排列表
单词词典(Term Dictionary),记录所有文档的单词,以及单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能插入与查询
倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项(Posting )组成。倒排索引项由文档ID、词频TF、位置(Position)和偏移(Offset)组成。偏移是记录单词的开始结束位置,可实现高亮显示。

六.Dynamic Mapping

在写入文档时,如果索引不存在。会自动创建索引,这就是Dynamic Mapping机制,它使得我们无需手动定义Mapping。elasticsearch会根据文档信息,推算出字段的类型。当然有时会推算不准,导致一些功能不正常,比如Range查询。
可以设置Mapping的dynamic属性,可以设置为“true”,“false”和“strict”,默认是“true”。当设为“false”时,新数据写入可以被索引,但新增字段被丢弃。当设为“strict”时,数据写入直接报错。

七.Term查询

      Term是表达语义的最小单位。搜索和利用统计语言模型进行自然语言处理都需要用到Term。在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含改词项的文档进行相关度算分。Term查询是包含,不是完全相等,针对多值字段查询要尤其注意。虽然Term查询,对输入不做分词,但es中的数据是进行分词处理后保存的。es对于text字段默认会增加一个keyword的多字段属性,该字段在写入时不会做分词处理,可以用来做严格匹配的查询。term查询很多时候是不需要算分的,可以通过Constant Score将查询转换成一个Filter,避免算分,并利用缓存,提高新能。

八.分析(analysis)

分析(analysis)是这样一个过程:
1.首先字符串经过字符过滤器(character filter),它们的工作是在标记化前处理字符串。字符过滤器能够去除HTML标记,或者转换 "&" 为 "and" 。
2.标记化一个文本块为适用于倒排索引单独的词(term)
3.然后标准化这些词为标准形式,提高它们的“可搜索性”或“查全率”

Text类型字段index 参数默认值是 analyzed 。如果我们想映射字段为确切值,我们需要设置它为 not_analyzed。其他简单类型(long 、 double 、 date 等等) 也接受 index 参数,但相应的值只能是 no 和 not_analyzed ,它们的值不能被分析。
注意对 analyzed 字段进行强制排序会消耗大量内存。

九.查询与过滤

       使用过滤语句得到的结果集 -- 一个简单的文档列表,快速匹配运算并存入内存是十分方便的, 每个文档仅需要1个字节。这些缓存的过滤结果集与后续请求的结合使用是非常高效的。查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存。原则上来说,做全文本搜索或其他需要进行相关性评分的时候使用查询语句,剩下的全部用过滤语句。特别是做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。查询语句可以包含过滤子句,反之亦然。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值