ES的查詢過程、倒排索引

一、ES的搜索過程

  1、query phase 查詢階段:
        1.客戶端發送請求,接受到的節點變成coordinate node協調節點;
        2.協調節點將搜索請求廣播給:該索引中每個節點的副本分片or主分片;
        3.每個分片將自己的搜索結果(一些doc id)返回給協調節點,由協調節點做數據的合併、排序、分頁等操作,產出最終的查詢結果;
  2、fetch phase 取回階段:
        4.協調節點根據查詢階段得到的結果集(doc id),向含有改文檔的分片發送get請求拉取實際的doc數據,返回給客戶端。

二、Lucene介紹

         分片shard是一個Lucene實例

三、ES的索引原理

  1、傳統關係型數據的索引結構:B樹、B+樹(Mysql)  

  2、倒排索引:k是分詞後的關鍵字,v是doc文檔編號
        正排索引:k是doc文檔編號,v是文檔內容

  3、索引邏輯:把term index加載到內存然後定位關鍵字在term dictionary中的大概位置,再找到具體term,再根據倒排索引posting list快速定位文檔。  (一切設計都是爲了提高搜索的性能)
            Posting List:term關聯的int數組,存儲了所有符合某個term的文檔id
            term dictionary:term的字典(所有term的集合),方便檢索term
            term index:結構是trie樹(字典樹),通過term index快速定位term dictionary的某個offset,再往後順序查找

  4、爲什麼ES/Lucene的檢索比mysql快:
       mysql只有term dictionary這層,以B+tree存儲在磁盤上,檢索時需要若干次的隨機訪問磁盤操作;
       Lucene在term dictionary的基礎上添加了term index來加速檢索,term index以樹的形式緩存在內存中。從term index定位到term dictionary的區域,再去磁盤上找term,減少磁盤的隨機訪問次數

  5、聚合查詢裏帶有過濾條件或檢索條件:先由倒排索引完成搜索,確定文檔範圍,再由正排索引提取field,做聚合計算。

  6、type=keyword類型字段不會分詞,直接根據字符串內容建立倒排索引;
        type=text類型在存入ES時,會先分詞,去掉停頓詞(無意義的詞,比如"的"/"啊",沒必要建立索引),再根據分詞後的關鍵字(term)建立倒排索引。

 

四、ELK

    ELK日誌系統:數據分佈式存儲、日誌解析、可視化查詢
           elasticsearch:分佈式存儲、全文檢索
           logstash:日誌收集系統
           kibana:數據可視化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章