ElasticSearch 搜尋引擎的簡單了解

2021-10-23 18:25:59 字數 2017 閱讀 2540

如果以連線資料庫來模擬,lucene就是jdbc,是基本的用法。es就相當 mybatis, 方便開發人員配置,訪問和呼叫。也就是說,elasticsearch 也是基於 lucene進行了封裝,底層就是lucene,提供了更為便利的訪問和呼叫 。而且它也是乙個分布式搜尋引擎。

因為在我們**中的資料,將來會非常多,所以採用以往的模糊查詢,大多數情況下,只是查詢字串裡面是否包含某個字段,也就是%**%,這樣是不會走索引的,會進行全表掃瞄。在百萬級別的資料庫中,效率非常低下,而我們使用es做乙個全文索引,我們將經常查詢的商品的某些字段,比如說商品名,描述、**放入我們索引庫里,可以提高查詢速度。

倒排索引

其實mysql的全文索引也是基於倒排索引

比如下面的文件,每個文件號對應不同的文件內容

對文件進行分詞之後,得到以下倒排索引。

那麼,有了倒排索引,搜尋引擎可以很方便地響應使用者的查詢。比如使用者輸入查詢 facebook,搜尋系統查詢倒排索引,從中讀出包含這個單詞的文件,這些文件就是提供給使用者的搜尋結果。

寫入資料的底層原理

資料先寫入記憶體 buffer,然後每隔 1s,將資料refresh到 os cache,到了 os cache 資料就能被搜尋到(所以我們才說 es 從寫入到能被搜尋到,中間有 1s 的延遲)。每隔 5s,將資料寫入 translog 檔案(es是通過translog的機制來保證資料的可靠性的,這樣如果機器宕機,記憶體資料全沒,最多會有 5s 的資料丟失),translog 大到一定程度,或者預設每隔 30mins,會觸發 commit 操作,然後會利用fsync,將緩衝區的資料都 flush 到 segment file 磁碟檔案中。

也就是說如果忽略掉快取的話,其實資料就是不斷從記憶體buffer,「refresh」到磁碟的segment file 的過程,每隔 1 秒鐘,es 將 buffer 中的資料寫入乙個新的 segment file,這個 segment file 中就儲存最近 1 秒內 buffer 中寫入的資料。

刪除和更新資料:

刪除和更新也都是寫操作,但是elasticsearch中的文件是不可變的,因此不能被刪除或者改動以展示其變更;

如果是刪除操作,磁碟上的每個 segment file都有乙個相應的.del檔案。當刪除請求傳送後,文件並沒有真的被刪除,而是在.del檔案中被標記為刪除。該文件依然能匹配查詢,但是會在結果中被過濾掉。因為每秒都會生成segment file,防止他越來越多,因此會定期執行merge。每次 merge 的時候,會將多個 segment file 合併成乙個,同時這裡會將標識為 deleted 的 doc 給物理刪除掉,然後將新的 segment file 寫入磁碟。

如果是更新操作,其實就是刪除+寫操作,就是將原來的 doc 標識為 刪除狀態,然後新寫入一條資料。

講一下es的搜尋過程

搜尋被執行成乙個兩階段過程,我們稱之為 query then fetch(查詢和取回);

首先是query階段,這個階段:每個節點將自己的搜尋結果(其實就是一些 doc id)返回給協調節點,由協調節點進行資料的合併、排序等操作,產出最終結果。

然後是fetch階段:接著由協調節點根據 doc id 去各個節點上拉取實際的 document 資料,最終返回給客戶端。

Elasticsearch 條件搜尋

es提供了兩種搜尋的方式 請求引數方式和請求體方式。請求引數方式 curl localhost 9200 bank search?q pretty 其中bank是查詢的索引名稱,q後面跟著搜尋的條件 q 表示查詢所有的內容 請求體方式 推薦這種方式 curl xpost localhost 9200...

Elasticsearch 深入搜尋

結構化搜尋 structured search 是指有關探詢那些具有內在結構資料的過程 在結構化查詢中,我們得到的結果 總是非是即否,要麼存於集合之中,要麼存在集合之外。結構化查詢不關心檔案的相關度或評分 它簡單的對文件包括或排除處理。當進行精確值查詢時,我們會使用過濾器 filters term ...

elasticsearch 搜尋方式

宣告 本文僅僅只是記個筆記 搜尋方式 took 耗費了幾毫秒 timed out 是否超時,這裡沒有 shareds 資料拆成1哥分片,所以對於搜尋請求,會打造所有的primary shard 或者是它的某個replica shard也可以 hits.total 查詢結果的數量,這裡有 3 個 do...