1、Elasticsearch-基础介绍

一、Elasticsearch

Elasticsearch 是一个分布式可扩展的实时搜索分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

  1. 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  2. 实时分析的分布式搜索引擎。
  3. 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
  4. 可处理多种数据类型,数字、文本、地理位置、结构化、非结构化。

二、Elasticsearch之所以查询快的理由

  1. 使用了倒排索引
  2. Term Dictionary
  3. Term Index
  4. 压缩技术Roaring Bitmap
  5. 联合索引

1、使用了倒排索引

2、Term Dictionary

Elasticsearch为了能快速找到某个term,将所有的term进行了排序,然后二分法查找term,但这并不是Elasticsearch快的原因。

3、Term Index

如果说Term Dictionary是直接去二分法翻字典,那么Term Index就是字典的目录页,假设我们的term如果全是英文单词,那么Term Index就是26个字母表,但是通常term未必都是英文,而可以是任意的byte数组。因为就算26个英文字符也不一定都有对应的term,比如:a开头的term只有一个,c开头的term有一百万个,x开头的term一个也没有,这样查询到c的时候又会很慢了。所以通常情况下Term Index 是包含term的一些前缀的一棵树,例如这样的一个Term Index:
1、Elasticsearch-基础介绍_第1张图片
Term Index据可以快速定位到某个offset(分支的开端),然后以此位置向下查找,再加上FST的压缩技术,将Term Index缓存到内存中,通过Term Index 找到对应的Term Dictionary的 block,然后再去磁盘直接找到term,减少磁盘的随机读写次数,大大的提升查询效率

Lucene4.0在查找Term时使用了FST算法,用来快速定位Term的位置。FST的数据结构可以理解成(key,value)的形式,FST有两个优点:

  1. 空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
  2. 查询速度快。O(len(str))的查询时间复杂度。

4、Posting List压缩技术Roaring Bitmap

[1,3,4,7,10]
对应的bitmap就是:
[1,0,1,1,0,0,1,0,0,1] 非常直观
1、Elasticsearch-基础介绍_第2张图片

5、联合索引

  1. Skip List 数据结构,同时遍历多个term的posting list,互相skip
  2. 使用bitset数据结构,对多个term分别求出bitset,对bitset做AN操作

总结和思考

Elasticsearch的索引思路:将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种压缩算法,用及其苛刻的态度使用内存。

所以,对于使用Elasticsearch进行索引时需要注意:

  1. 不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的
  2. 同样的道理,对于String类型的字段,不需要analysis的也需要明确定义出来,因为默认也是会analysis的
  3. 选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询

本文转载:https://www.cnblogs.com/dreamroute/p/8484457.html

https://blog.csdn.net/qq_36289377/article/details/82993160

你可能感兴趣的:(elasticsearch,elasticsearch,搜索引擎,大数据)