Elasticsearch的學習筆記

來源:互聯網
上載者:User

標籤:

在介紹Elasticsearch的用法之前先講講為什麼要用它吧。首先學習搜尋引擎,肯定不可避免的都聽過lucene,solr和Elasticsearch都是基於它的。spinx文章很多,但是資料庫的入侵性太強(外掛程式模式)。Elasticsearch是當下最流行的分布式搜尋引擎之一。solr也稍微玩過,文章也多。同時也希望能通過Elasticsearch進一步學習完善自己對於分布式的學習。更深入的同學可以考慮開始學習ELK(Elasticsearch, Logstash, Kibana)。

推薦:《Elasticsearch-definitive-guide》

看過這本書之後入門就成了很簡單的事,書很淺顯易懂,沒什麼特別難的地方。

其中有一個例子寫的非常好,可以作為全域引導大家學習,摘抄一部分過來:

我們首先要做的是儲存員工資料,每個文檔代表一個員工。在Elasticsearch中儲存資料的行為就叫做索引(indexing),不過在索引之前,我們需要明確資料應該儲存在哪裡。

在Elasticsearch中,文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,我們可以畫一些簡單的對比圖來類比傳統關係型資料庫:

Relational DB -> Databases -> Tables -> Rows -> ColumnsElasticsearch -> Indices   -> Types  -> Documents -> Fields

Elasticsearch叢集可以包含多個索引(indices)(資料庫),每一個索引可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然後每個文檔包含多個欄位(Fields)(列)。

「索引」含義的區分

你可能已經注意到索引(index)這個詞在Elasticsearch中有著不同的含義,所以有必要在此做一下區分:

  • 索引(名詞) 如上文所述,一個索引(index)就像是傳統關聯式資料庫中的資料庫,它是相關文檔儲存的地方,index的複數是indices 或indexes。
  • 索引(動詞) 「索引一個文檔」表示把一個文檔儲存到索引(名詞)裡,以便它可以被檢索或者查詢。這很像SQL中的INSERT關鍵字,差別是,如果文檔已經存在,新的文檔將覆蓋舊的文檔。
  • 倒排索引 傳統資料庫為特定列增加一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的資料結構來達到相同目的。

預設情況下,文檔中的所有欄位都會被索引(擁有一個倒排索引),只有這樣他們才是可被搜尋的。

 

 

理解上面的索引介紹後,接下來就是很入門的開工工作了。安裝Elasticsearch:

  1. 安裝JDK()
  2. 安裝Elasticsearch()
    1. 解壓,運行\bin\elasticsearch.bat.
    2. 瀏覽器輸入http://localhost:9200/,可以看到

    3. 安裝成功。
  3. 安裝Elasticsearch – header plugin https://github.com/mobz/elasticsearch-head

    這個外掛程式主要是用來管理索引資料和狀態,文檔中有詳細說明,安裝步驟也很簡單,用命令列轉bin目錄下運行外掛程式安裝

    完成後,開啟http://localhost:9200/_plugin/head/就可以看到下面這個管理介面

     

  這樣子安裝算告一段落了,可以開始寫點代碼做點實事了,我用的是NEST這個Client工具,大家可以根據自己的語言選擇工具。

  一般而言,我們用到搜尋的功能都是全文索引,否則也沒必要用搜尋引擎了:

 

            var node = new Uri("http://localhost:9200");            var settings = new ConnectionSettings(                node,                defaultIndex: "my-application"            );            var client = new ElasticClient(settings);            var person = new Person            {                Id = "2",                Firstname = "中文測試一下 天才",                Lastname = "哈哈 你是天才嗎?"            };            var index = client.Index(person, i => i                .Index("sample-index")                .Type("sample-type")                .Id("1-should-not-be-the-id")                .Refresh()                .Ttl("1m")            );            //query_string只是其中一種最常用查詢,Operator枚舉的Or和And可以根據全文檢索索引的業務要求使用,以下查詢就是為了最簡單的分頁全文檢索索引介面            var searchResults = client.Search<Person>(s => s                .Index("sample-index")                .Type("sample-type")                .Query(q => q.QueryString(qs => qs.Query("天才").DefaultOperator(Operator.And)))                     .From(0)       //分頁頁碼                .Size(10)      //分頁尺寸            );            foreach (var item in searchResults.Documents)            {                Console.WriteLine("item:" + Newtonsoft.Json.JsonConvert.SerializeObject(item));            }            Console.ReadLine();

 

 運行結果:

 

以上只用到了QueryString,當然它的查詢方法遠不只這些,具體的查詢方法我這裡就不班門弄斧了。推薦去看文檔。附上NEST的文檔:http://nest.azurewebsites.net/nest/quick-start.html

  Elasticsearch致力於隱藏分布式系統的複雜性。以下這些操作都是在底層自動完成的:

  • 將你的文檔分區到不同的容器或者分區(shards)中,它們可以存在於一個或多個節點中。
  • 將分區均勻的分配到各個節點,對索引和搜尋做負載平衡。
  • 冗餘每一個分區,防止硬體故障造成的資料丟失。
  • 將叢集中任意一個節點上的請求路由到相應資料所在的節點。
  • 無論是增加節點,還是移除節點,分區都可以做到無縫的擴充和遷移。

  你可以看到以下預設的分區情況:


很明顯以上分區都在同一個node上,而分區又組成了叢集。其中node本身是有可能存在主分區和複製分區,而節點與節點之間又有可能通過分區聯絡。
還有一些很關鍵的叢集模組,叢集健康監控,Elasticsearch健康有三種狀態:green、yellow或red。限制query執行時佔用的JVM Heap sized等等。
對於分布式這塊這裡就不能再往下展開了,具體可學習文中提到的那本書,裡面有詳細介紹。而效能方面,由於現在公司的業務根本達不到這個數量級,暫時無法給出較好的對比。千百萬層級,不管solr,還是ES都是OK的。上億恐怕要斟酌和最佳化了。



 

Elasticsearch的學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.