2014-02-26 185 views
3

我想知道elasticsearch如何快速搜索。它是否使用倒排索引,它是如何在內存中表示的?它如何存儲在磁盤上?它如何從磁盤加載到內存?它如何快速地合併索引(我的意思是在搜索時如何將兩個列表如此快速地結合起來)?彈性搜索如何保持索引

回答

1

elasticsearch使用lucene存儲逆文檔索引。 Lucene將依次存儲稱爲具有反向索引數據段的只讀文件。每段都包含一些文檔。這些段是隻讀的,永遠不會改變。要刪除或更新文檔,elasticsearch將維護一個刪除/更新列表,該列表將用於覆蓋只讀段的結果。

通過這種方法,某些細分可能會完全廢棄或僅包含少量最新數據。這些細分市場將被重寫或刪除。

有一個有趣的elasticsearch插件,可視化段和重寫的過程: https://github.com/polyfractal/elasticsearch-segmentspy

要看到它在行動開始索引大量的數據,看到了部分信息。

與段API,您可以檢索有關段的信息: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-segments.html

1

我會分享我所瞭解的ElasticSearch(ES)。是ES採用了倒排索引,這裏是它如何被構建的 - 如果我們對這些文檔的空白分析 -

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

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

倒排索引

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

該索引建立在索引時間,文檔被分配給基於哈希文件的碎片ID。無論何時發出搜索請求,都會執行查找所有碎片,然後將其結果合併並返回給請求者。由於倒排索引的性能,結果被返回並快速合併。

ES將數據存儲在您啓動ES並創建索引後創建的數據文件夾中。文件結構類似於 - /data/clustername/nodes/...,如果您查看此目錄,您將瞭解它的組織結構。您可以定義ES'索引數據的存儲方式here。例如,所有索引數據都存儲在磁盤上的內存中。

有很多關於ES網站的信息,還有幾本關於ES的出版書籍,你可以看到這些here

+0

我已經打了倒排索引一點。其中我保留了頁面的ID和單詞的位置:「單詞」:{page_id:0,2,12; next_page_id:10,15}。我將它序列化爲json字符串並保存在db中。在抓取了五十萬頁的索引後,一些常見詞彙達到了大約5Mb,因此從db中取出並將其反序列化回去需要很長時間。然後處理這些試圖在其中找到常見頁面的數據塊也不是很快。所以我猜彈性搜索有不同的事情... – ren