标签:应用 复杂 寻址 默认 mit sql com 不能 介绍
从底层介绍ElasticSearch Shard的内部原理,以及回答为什么使用ElasticSearch有必要了解Lucene的内部工作方式?
了解ElasticSearch API的代价
了解索引的存储方式
elasticsearch版本: elasticsearch-2.2.0
毫不夸张的说,如果不了解Lucene索引的工作方式,可以说完全不了解Lucene,对于ElasticSearch更是如此。
需要注意的是搜索的应用场景
如果是进行前缀查询(右模糊匹配)或者是短语查询(phrase queries),ElasticSearch可能不合适,需要做特殊的优化。(在2.x中,ES对以上应用场景都有支持,具体使用方式可以参考:Search in Depth)
以两个简单的文件为例:Lucene in action和Databases。
假设Lucene in action里有单词
{index, term, data, Lucene}
Databases里有单词
{sql, index, data}
对于range query有序
查询的时间复杂度为O(log(n))
一般的关系型数据库大致结构可能是上面这样的一颗B、B+树,但是Lucene是另外一种存储结构。
对于Lucene来说,其主要的存储结构是一个反向索引,它是一个数组,数组里面是一个有序的数据字典。
这样一个存储结构存在与Lucene的Segment里。
这两种结构的一个重要区别是:在增加或删除文件时,系统会树形结构频繁操作,这个结构是一直变化的,而反向索引可以维持不变(Immutable)。
当有很多segment时,系统会合并segment
这个过程本质上是一个merge sort,做的事情就是
当更新一个文件的时候,我们实际上是创建了一个新的segment,因此
Segments永远不会被修改
Terms 高度去重
文件本身由唯一序号标识
Terms 由唯一序号标识
很多数据库不支持同时使用多个索引,但是Lucene支持
Lucene为postings lists 维护一个skip list(Wiki),如果要搜索如上例子中的“red shoe”,系统参考skip list里的信息可以跳跃检索(“leap-frog”)
对于很多数据库,它们会挑选最主要的索引(most selective),而忽略其他
关于详细的index intersection算法以及如何使用skip list的可以参照(nlp.standford.edu)
文件有序、字段有序
分面是指事物的多维度属性。例如一本书包含主题、作者、年代等分面。而分面搜索是指通过事物的这些属性不断筛选、过滤搜索结果的方法。可以将分面搜索看成搜索和浏览的结合。分面搜索作为一种有效的搜索方式,已经被用在电子商务、音乐、旅游等多个方面。
例如,谷歌音乐的挑歌页面,将歌曲分为节奏、声调、音色、年代、流派等分面
根据文件与搜索匹配的情况计数
简单(naive)方案
Lucene方案
因为ordinal是密集的,所以可以简单用数组array来表示。
ElasticSearch高级API 都是基于Lucene API构建的,这些基础的API包括:
-----------------------------------------------------------------------------------------------
API | 用途 | 方法
-----------------------------------------------------------------------------------------------
Inverted index | Term -> doc ids, positions, offsets | AtomicReader.fields
-----------------------------------------------------------------------------------------------
Stored fields | Summaries of search results | IndexReader.document
-----------------------------------------------------------------------------------------------
Live docs | Ignoring deleted docs | AtomicReader.liveDocs
-----------------------------------------------------------------------------------------------
Term vectors | More like this | IndexReader.termVectors
-----------------------------------------------------------------------------------------------
Doc values/Norms | Sorting/faceting/scoring | AtomicReader.get*Values
-----------------------------------------------------------------------------------------------
数据有四份重复,只是结构各不相同
Stored Fields和Document Values
两种结构为不同的使用场景优化
保存文件的句柄
不要为每个字段每个文件使用文件
避免磁盘寻址
磁盘寻址的时间大概为~10ms
不要忽略文件系统的缓存
随机访问小文件还是可以的
使用轻压缩
默认的编码格式已经优化内存与速度之间的关系
不要使用RAMDirectory、MemoryPostingsFormat、MemoryDocValuesFormat。
详细信息参照
http://lucene.apache.org/core/4_5_1/core/org/apache/lucene/codecs/packagesummary.
html
Bit packing / vlnt encoding
LZ4
FSTs
Terms Index
在索引中查找相应的词
Terms Dictionary
跳到字典偏移的位置
压缩是基于共享前缀的,与“BlockTree term dict”类似
顺序读取直到找到特定的Term
Postings List
用改进的FOR(Frame of Reference)进行增量编码
Stored Fields
对一个子集的doc id,索引存于内存中
高效内存(monotonic)压缩
二分查找
字段
顺序存储
使用16KB块存储压缩
每个文件1次磁盘寻址(Stored Fields)
terms dict/postings lists都在文件系统的缓存中
此时不会发生磁盘寻址
“脉冲”优化
上图中系统性能出现两次下降,可能的情况是
索引增长超过文件系统缓存的大小
Stored Fields不再全部存储于缓存中
Terms dict/Postings lists不全在缓存中
参考来源:
SlideShare: What is in a Lucene index?
Youtube: What is in a Lucene index? Adrien Grand, Software Engineer, Elasticsearch
SlideShare: Elasticsearch From the Bottom Up
Youtube: Elasticsearch from the bottom up
Standford Edu: Faster postings list intersection via skip pointers
StackOverflow: how an search index works when querying many words?
StackOverflow: how does lucene calculate intersection of documents so fast?
Lucene and its magical indexes
ElasticSearch 2 (10) - 在ElasticSearch之下(深入理解Shard和Lucene Index)
标签:应用 复杂 寻址 默认 mit sql com 不能 介绍
原文地址:http://www.cnblogs.com/valor-xh/p/6206041.html