Elasticsearch學習筆記

在介紹Elasticsearch的用法以前先講講爲何要用它吧。首先學習搜索引擎,確定不可避免的都聽過lucene,solr和Elasticsearch都是基於它的。spinx文章不少,可是數據庫的入侵性太強(插件模式)。Elasticsearch是當下最流行的分佈式搜索引擎之一。solr也稍微玩過,文章也多。同時也但願能經過Elasticsearch進一步學習完善本身對於分佈式的學習。更深刻的同窗能夠考慮開始學習ELK(Elasticsearch, Logstash, Kibana)。html

推薦:《Elasticsearch-definitive-guide》java

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

其中有一個例子寫的很是好,能夠做爲全局引導你們學習,摘抄一部分過來:git

咱們首先要作的是存儲員工數據,每一個文檔表明一個員工。在Elasticsearch中存儲數據的行爲就叫作索引(indexing),不過在索引以前,咱們須要明確數據應該存儲在哪裏。github

在Elasticsearch中,文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,咱們能夠畫一些簡單的對比圖來類比傳統關係型數據庫:web

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

Elasticsearch集羣能夠包含多個索引(indices)(數據庫),每個索引能夠包含多個類型(types)(表),每個類型包含多個文檔(documents)(行),而後每一個文檔包含多個字段(Fields)(列)。數據庫

「索引」含義的區分

你可能已經注意到索引(index)這個詞在Elasticsearch中有着不一樣的含義,因此有必要在此作一下區分:瀏覽器

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

默認狀況下,文檔中的全部字段都會被索引(擁有一個倒排索引),只有這樣他們纔是可被搜索的。數據結構

 

 

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

  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工具,你們能夠根據本身的語言選擇工具。

  通常而言,咱們用到搜索的功能都是全文索引,不然也不必用搜索引擎了:

 

        static void Main(string[] args)
        {
            //var person = new Person
            //{
            //    Id = System.Guid.NewGuid().ToString("N"),
            //    Firstname = "中文測試一下 天才",
            //    Lastname = "哈哈 蠢的不行?"
            //};
            //CraateIndex(person);
            var items = GetPagingForSearch<Person>("天才", "firstname", SortOrder.Descending, 0, 10);
            foreach (var item in items)
            {
                Console.WriteLine("item:" + Newtonsoft.Json.JsonConvert.SerializeObject(item));
            }

            Console.ReadLine();
        }

        public static IList<T> GetPagingForSearch<T>(string key, string orderbyKey, SortOrder orderType, int index, int size) where T : class
        {
            var client = GetClient();
            //query_string只是其中一種最經常使用查詢,Operator枚舉的Or和And能夠根據全文檢索的業務要求使用,如下查詢就是爲了最簡單的分頁全文檢索接口
            var searchResults = client.Search<T>(s => s
                .Index("sample-index")
                .Type("sample-type")
                .Query(q => q.QueryString(qs => qs.Query(key).DefaultOperator(Operator.And)))
                .Sort(sort => sort.OnField(orderbyKey).Order(orderType))
                .From(index * size)       //分頁頁碼
                .Size(size)      //分頁尺寸
            );

            return searchResults.Documents.ToList();
        }

        public static void CraateIndex<T>(T model) where T : class
        {
            var client = GetClient();
            var index = client.Index(model, i => i
                .Index("sample-index")
                .Type("sample-type")
                .Id(System.Guid.NewGuid().ToString("N"))
                .Refresh()
                .Ttl("1m")
            );
        }

        public static ElasticClient GetClient()
        {
            var node = new Uri("http://localhost:9200");

            var settings = new ConnectionSettings(
                node,
                defaultIndex: "my-application"
            );

            return new ElasticClient(settings);
        }  

 

 

 運行結果:

 

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

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

  • 將你的文檔分區到不一樣的容器或者分片(shards)中,它們能夠存在於一個或多個節點中。
  • 將分片均勻的分配到各個節點,對索引和搜索作負載均衡。
  • 冗餘每個分片,防止硬件故障形成的數據丟失。
  • 將集羣中任意一個節點上的請求路由到相應數據所在的節點。
  • 不管是增長節點,仍是移除節點,分片均可以作到無縫的擴展和遷移。

  你能夠看到如下默認的分片狀況:


很明顯以上分片都在同一個node上,而分片又組成了集羣。其中node自己是有可能存在主分片和複製分片,而節點與節點之間又有可能經過分片聯繫。
還有一些很關鍵的集羣模塊,集羣健康監控,Elasticsearch健康有三種狀態:、或。限制query執行時佔用的JVM Heap sized等等。對於分佈式這塊這裏就不能再往下展開了,具體可學習文中提到的那本書,裏面有詳細介紹。而性能方面,因爲如今公司的業務根本達不到這個數量級,暫時沒法給出較好的對比。千百萬級別,無論solr,仍是ES都是OK的。上億恐怕要斟酌和優化了。greenyellowred
相關文章
相關標籤/搜索