Elasticsearch 使用一種稱爲 倒排索引 的結構,它適用於快速的全文搜索。
一個倒排索引由文檔中全部不重複詞的列表構成,對於其中每一個詞,有一個包含它的文檔列表。算法
假設咱們有兩個文檔,每一個文檔的 content 域包含以下內容:ui
爲了建立倒排索引,咱們首先將每一個文檔的 content 域拆分紅單獨的 詞(咱們稱它爲 詞條 或 tokens ),建立一個包含全部不重複詞條的排序列表,而後列出每一個詞條出如今哪一個文檔。結果以下所示:code
Term Doc_1 Doc_2 ------------------------- Quick | | X The | X | brown | X | X dog | X | dogs | | X fox | X | foxes | | X in | | X jumped | X | lazy | X | X leap | | X over | X | X quick | X | summer | | X the | X | ------------------------
如今,若是咱們想搜索 quick brown ,咱們只須要查找包含每一個詞條的文檔:排序
Term Doc_1 Doc_2 ------------------------- brown | X | X quick | X | ------------------------ Total | 2 | 1
兩個文檔都匹配,可是第一個文檔比第二個匹配度更高。若是咱們使用僅計算匹配詞條數量的簡單 類似性算法 ,那麼,咱們能夠說,對於咱們查詢的相關性來說,第一個文檔比第二個文檔更佳。索引
可是,咱們目前的倒排索引有一些問題:token
使用前面的索引搜索 +Quick +fox 不會獲得任何匹配文檔。(記住,+ 前綴代表這個詞必須存在。)只有同時出現 Quick 和 fox 的文檔才知足這個查詢條件,可是第一個文檔包含 quick fox ,第二個文檔包含 Quick foxes 。文檔
咱們的用戶能夠合理的指望兩個文檔與查詢匹配。咱們能夠作的更好。ast
若是咱們將詞條規範爲標準模式,那麼咱們能夠找到與用戶搜索的詞條不徹底一致,但具備足夠相關性的文檔。例如:搜索
如今索引看上去像這樣:查詢
Term Doc_1 Doc_2 ------------------------- brown | X | X dog | X | X fox | X | X in | | X jump | X | X lazy | X | X over | X | X quick | X | X summer | | X the | X | X ------------------------