弹性搜索如何保持索引

时间:2014-02-26 14:46:56

标签: elasticsearch

我想知道elasticsearch如何搜索如此之快。它是否使用倒排索引,它是如何在内存中表示的?它是如何存储在磁盘上的?它如何从磁盘加载到内存?它如何快速合并索引(我的意思是在搜索它如何快速组合两个列表时)?

2 个答案:

答案 0 :(得分:1)

我将分享我对ElasticSearch(ES)的了解。是ES使用倒排索引,这是如何构造 - 如果我们在这些文档上有一个空白分析器 -

{
    "_id": 1,
    "text": "Hello, John"
}

{
    "_id": 2,
    "text": "Bonjour, John"
}

INVERTED INDEX

  Word   |   Docs 
___________________
 Hello   |    1
 Bonjour |    2
 John    |   1&2

此索引是在索引时构建的,文档基于散列文档ID分配给分片。每当发出搜索请求时,都会对所有分片执行查找,然后将其结果合并并返回给请求者。由于倒排索引的性能,结果返回并快速合并。

ES在您启动ES并创建索引后,将数据存储在创建的数据文件夹中。文件结构类似于这个 - /data/clustername/nodes/...,如果您查看此目录,您将了解它的组织方式。您可以定义ES'索引数据的存储方式here。例如,所有索引数据都存储在磁盘上的内存中。

ES网站上有大量信息,还有一些关于ES的出版书籍,你可以看到这些here

答案 1 :(得分:1)

elasticsearch使用lucene来存储逆文档索引。 Lucene反过来将存储带有反向索引数据的称为段的只读文件。每个细分包含一些文档。这些段是只读的,永远不会更改。要删除或更新文档,elasticsearch将维护一个删除/更新列表,该列表将用于覆盖只读段的结果。

通过这种方法,某些细分可能会完全过时或仅包含少量最新数据。此类细分将被重写或删除。

有一个有趣的elasticsearch插件可视化片段和重写过程: https://github.com/polyfractal/elasticsearch-segmentspy

要查看它的运行情况,请开始索引大量数据并查看细分信息。

使用Segment API,您可以检索有关细分的信息: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-segments.html