ES(ElasticSearch)搜索

ES(ElasticSearch)搜索

1、ES簡介
ElasticSearch是一個基於Lucene的實時的分佈式搜索和分析引擎。設計用於雲計算中能夠達到實時搜索,穩定可靠,快速,安裝使用方便。基於RESTFUL接口。
2、原理
ES使用了倒排索引(inverted index),該結構對於全文檢索非常快。
倒排索引包括一個在任意文檔中出現的唯一性的詞語列表,對於每個詞語,都有一個它出現過的文檔列表。
如下圖所示:
Doc_1:
The quick brown fox jumped over the lazy dog
Doc_2:
Quick brown foxed leap over lazy dogs in summer

在這裏插入圖片描述
現在我們查詢quick brown(注意,quick是小寫),我們只需要知道這個詞在哪些文檔出現過:
如果我們使用簡單的相似性算法,比如說將每個文檔匹配的詞語數相加,我們就能看出來第一個文檔更加匹配,比第二個文檔更加符合我們的查詢條件:quick brown。

但是我們當前的倒排索引有幾個問題:

1、Quick和quick作爲不同的詞語出現,用戶可能認爲它們相同。
2、fox和foxes也很相似,就像dog和gods一樣。
3、jumped和leap雖然看起來不一樣,但是是同義詞

針對這個問題,處理的方法是進行算法優化。如Quick全小寫,則和quick一樣。還有複數轉原型,如dogs轉成dog。同義詞合併,如 jumped和leap可以合併成jump等優化。

進行分詞和同義詞等操作稱爲「分析」。

進行分析後可以按照搜索關鍵詞出現的頻率進行倒序排列,將結果返回。

但是,如果這樣返回的話存在一個問題,那就是如果關鍵詞在兩個文檔中都存在怎麼辦。比如「dog」在Doc_1和Doc_2中都出現過,怎麼確定Doc_1和Doc_2的返回順序呢?處理的方法是,在算法中增加每個關鍵詞的權重,同一個關鍵詞在不同的文檔中對文檔的關鍵程度是不同的。權重大的可以看做更符合用戶所查詢內容,優先返回。

以上,就是我所理解的倒排索引,如有不對,請指正。

3、ES基本概念

  • 索引(Index)

ES將數據存儲於一個或多個索引中,索引是具有類似特性的文檔的集合。相對於關係型數據庫來說,索引類似SQL中的數據庫(database),或者一個數據存儲方案(Schema)。

  • 類型(Type)

類型是索引內部的邏輯分區,然而其意義完全取決於用戶需求。因此,一個索引內部可以定義多個類型。類型類似SQL中的表(tables)。
文檔(Document)
文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,基於json格式進行表示。 文檔由一個或多個域組成,每個域擁有一個名字及一個或多個值,有多個值的域通常稱爲「多值域」。每個文檔可以存儲不同的域集,但同一類型下的文檔至應該有某種程度上的相似之處。

  • 映射(Mapping)

ES中,所有的文檔在存儲之前都要進行分析,用戶可根據需要定義如何將文本分割成token、那些token應該被過濾掉,以及那些文本需要進行額外處理等待。

  • 集羣(Cluster)

ES集羣是一個或多個節點的集合,它們共同存儲了整個數據集,並提供了聯合索引以及可跨所有節點的搜索能力。

多節點組成的集羣擁有冗餘能力,它可以在一個或幾個節點出現故障時保證服務的整體可用性。

集羣靠其獨有的名稱進行標識,默認名稱爲「elasticsearch」。節點靠其集羣名稱來決定加入哪個ES集羣,一個節點只能屬一個集羣。

如果不考慮冗餘能力等特性,僅有一個節點的ES集羣一樣可以實現所有的存儲及搜索功能。

  • 節點(Node)

運行了單個實例的ES主機稱爲節點,它是集羣的一個成員,可以存儲數據、參與集羣索引及搜索操作。

類似於集羣,節點靠其名稱進行標識,默認爲啓動時自動生成的隨機Marvel字符名稱。

用戶可以按需要自定義任何希望使用的名稱,但出於管理的目的,此名稱應該儘可能有較好的識別性。

節點通過爲其配置的ES集羣名稱確定其所要加入的集羣。

  • 分片(Shard)和副本(Replica)

ES的「分片(shard)」機制可將一個索引內部的數據分佈地存儲於多個節點,它通過將一個索引切分爲多個底層物理的Lucene索引完成索引數據的分割存儲功能,這每一個物理的Lucene索引稱爲一個分片(shard)。

每個分片其內部都是一個全功能且獨立的索引,因此可由集羣中的任何主機存儲。創建索引時,用戶可指定其分片的數量,默認數量爲5個。

Shard有兩種類型:primary和replica,即主shard及副本shard。

Primary shard用於文檔存儲,每個新的索引會自動創建5個 Primary shard,當然此數量可在索引創建之前通過配置自行定義,不過,一旦創建完成,其Primary shard的數量將不可更改。

Replica shard是Primary Shard的副本,用於冗餘數據及提高搜索性能。

每個Primary shard默認配置了一個Replica shard,但也可以配置多個,且其數量可動態更改。ES會根據需要自動增加或減少這些Replica shard的數量。

ES集羣可由多個節點組成,各Shard分佈式地存儲於這些節點上。

ES可自動在節點間按需要移動shard,例如增加節點或節點故障時。簡而言之,分片實現了集羣的分佈式存儲,而副本實現了其分佈式處理及冗餘功能。
4、RESTful接口
前文說過,ES是基於RESTful接口的。

REST的操作分爲以下幾種:
在這裏插入圖片描述 get:獲取對象的當前狀態。類似SQL中的select。 put:改變對象的狀態,如果沒有對象則創建。類似SQL中的updata。 post:創建對象。類似SQL中的insert。 delete:刪除兌現。類似SQL中的delete。