## 總體架構
<div style="text-indent:2em;">
<p>盡管我希望直奔主題,介紹Lucene的架構,但是首先必須理解一些概念才能更好地理解Lucene的架構,這些概念是:</p>
<hr>
<ul>
<li><b>Document</b>: 它是在索引和搜索過程中數據的主要表現形式,或者稱“載體”,承載著我們索引和搜索的數據,它由一個或者多個域(Field)組成。 </li>
<li><b>Field</b>: 它是Document的組成部分,由兩部分組成,名稱(name)和值(value)。</li>
<li><b>Term</b>: 它是搜索的基本單位,其表現形式為文本中的一個詞。</li>
<li><b>Token</b>: 它是單個Term在所屬Field中文本的呈現形式,包含了Term內容、Term類型、Term在文本中的起始及偏移位置。</li>
</ul>
<hr>
<p>Apache Lucene把所有的信息都寫入到一個稱為**倒排索引**的數據結構中。這種數據結構把索引中的每個Term與相應的Document映射起來,這與關系型數據庫存儲數據的方式有很大的不同。讀者可以把倒排索引想象成這樣的一種數據結構:數據以Term為導向,而不是以Document為導向。下面看看一個簡單的倒排索引是什么樣的,假定我們的Document只有title域(Field)被編入索引,Document如下:</p>
* ElasticSearch Servier (document 1)
* Mastering ElasticSearch (document 2)
* Apache Solr 4 Cookbook (document 3)
所以索引(以一種直觀的形式)展現如下:
| Term | count | Docs |
| -- | -- | -- |
| 4 | 1 | <3> |
|Apache | 1 | <3> |
| Cookbook | 1 | <3> |
| ElasticSearch | 2 | <1> <2> |
| Mastering | 1 | <1> |
| Server | 1 | <1> |
| Solr | 1 | <3> |
<br/><br/>
<p>正如所看到的那樣,每個詞都指向它所在的文檔號(Document Number/Document ID)。這樣的存儲方式使得高效的信息檢索成為可能,比如基于詞的檢索(term-based query)。此外,每個詞映射著一個數值(Count),它代表著Term在文檔集中出現的頻繁程度。
</p>
<br/>
<p>當然,Lucene創建的真實索引遠比上文復雜和先進。這是因為在Lucene中,<b>詞向量</b>(由單獨的一個Field形成的小型倒排索引,通過它能夠獲取這個特殊Field的所有Token信息)可以存儲;所有Field的原始信息可以存儲;刪除Document的標記信息可以存儲……。核心在于了解數據的組織方式,而非存儲細節。</p>
<br/>
<p>每個索引被分成了多個段(Segment),段具有一次寫入,多次讀取的特點。只要形成了,段就無法被修改。例如:被刪除文檔的信息被存儲到一個單獨的文件,但是其它的段文件并沒有被修改。</p><br/>
<p>需要注意的是,多個段是可以合并的,這個合并的過程稱為<b>segments merge</b>。經過強制合并或者Lucene的合并策略觸發的合并操作后,原來的多個段就會被Lucene創建的更大的一個段所代替了。很顯然,段合并的過程是一個I/O密集型的任務。這個過程會清理一些信息,比如會刪除.del文件。除了精減文件數量,段合并還能夠提高搜索的效率,畢竟同樣的信息,在一個段中讀取會比在多個段中讀取要快得多。但是,由于段合并是I/O密集型任務,建議不好強制合并,小心地配置好合并策略就可以了。<p>
<!--note structure -->
<div style="height:110px;width:650px;text-indent:0em;">
<div style="float:left;width:13px;height:100%; background:black;">
<img src="../lm.png" height="100px" width="13px" style="margin-top:5px;"/>
</div>
<div style="float:left;width:50px;height:100%;position:relative;">
<img src="../note.png" style="position:absolute; top:30%; "/>
</div>
<div style="float:left; width:550px;height:100%;">
<p style="font-size:13px;"><br/>如果想了解段由哪些文件組成,想了解每個文件中存儲了什么信息,可以參考Apache Lucene documentation ,訪問地址:http://lucene.apache.org/core/4_5_0/core/org/apache/lucene/codecs/lucene45/package-summary.html.</p>
</div>
<div style="float:left;width:13px;height:100%;background:black;">
<img src="../rm.png" height="100px" width="13px" style="margin-top:5px;"/>
</div>
</div> <!-- end of note structure -->
</div>
- 前言
- 第1章 認識Elasticsearch
- 認識Apache Lucene
- 熟悉Lucene
- 總體架構
- 分析你的文本
- Lucene查詢語言
- 認識 ElasticSearch
- 基本概念
- ElasticSearch背后的核心理念
- ElasticSearch的工作原理
- 本章小結
- 第2章 強大的用戶查詢語言DSL
- Lucene默認打分算法
- 查詢重寫機制
- 重排序
- 批處理
- 查詢結果的排序
- Update API
- 使用filters優化查詢
- filters和scope在ElasticSearch Faceting模塊的應用
- 本章小結
- 第3章 索引底層控制
- 第4章 探究分布式索引架構
- 選擇恰當的分片數量和分片副本數量
- 路由功能淺談
- 調整集群的分片分配
- 改變分片的默認分配方式
- 查詢的execution preference
- 學以致用
- 本章小結
- 第5章 管理Elasticsearch
- 選擇正確的directory實現類——存儲模塊
- Discovery模塊的配置
- 索引段數據統計
- 理解ElasticSearch的緩存
- 本章小結
- 第6章 應對突發事件
- 第7章 優化用戶體驗
- 第8章 ElasticSearch Java API
- 第9章 開發ElasticSearch插件