如何聚合多個節點或分片的資料生成返回結果?
es是如何將相關度高的內容能放在前面的?
在對mysql進行分庫分表的時候,經常會遇到乙個問題:如果查詢的資料分散在多張表中,因為涉及到組合多種表的資料,將會非常麻煩;對於有些分頁場景,更是乙個災難,所以對mysql分庫分表的時候經常會基於查詢維度來盡量避免跨表查詢的場景。
elasticsearch也是分布式的,當資料分散與多個節點或者分片上時,他是如何解決資料聚合問題的呢?另外,搜尋基本都需要排序,如何解決排序問題呢?
假設有n個分片,資料可能分散在這n個分片上,es搜尋時,整體操作過程是:
有經驗的開發很容易看出來,這裡有兩個問題:
elasticsearch查詢的時候可以指定搜尋型別
向索引的所有分片(shard)都發出查詢請求,各分片返回的時候把元素文件(document)和計算後的排名資訊一起返回。
這種搜尋方式是最快的,只需要去shard查詢一次,但是各個shard返回的結果的數量之和可能是使用者要求的size的n倍。
先向所有的shard發出請求,各分片只返回排序和排名相關的資訊(注意,不包括文件document),然後按照各分片返回的分數進行重新排序和排名,取前size個文件;接著去相關的shard取document。
這種方式返回的document與使用者要求的size是相等的。
在進行真正的查詢之前,先把各個分片的詞頻和文件頻率收集一下,然後進行詞搜尋的時候,各分片依據全域性的詞頻率和文件頻率進行搜尋和排名。
接著按照query_and_featch的方式查詢。
和上面一種方式一樣,也是先收集詞頻和文件頻率,然後再按照query_then_featc的方式查詢。
這種查詢要前後互動三次,速度最慢,但是排名最準確。
在原理篇我們知道,當將乙個文件儲存到elasticsearch會根據分詞的結果建立倒排索引,這種結構是零散的,即每乙個term都會對應posting list。查詢的時候也是先經過分詞,然後根據倒排索引查詢。
這裡就有乙個問題,elasticsearch是如何將匹配度最高的內容放在前面的?如下圖所示,匹配效果最好的內容放到了返回結果的最前面。
lucene 使用布林模型(boolean model)查詢匹配文件,並使用權重來實現相關度搜尋
就是在查詢中使用 and、or、not(即與或非)來匹配文件
權重由三個因素決定:詞頻、逆向文件頻率、字段長度歸一值
向量空間模型
通常我們都是搜尋多個字段,這樣就需要合併多詞權重,這個由向量空間模型實現。具體合併過程基本都是數學上的演算法,沒有詳細研究,有興趣的小夥伴可以到網上找一下。
ElasticSearch關於倒排索引
在我們說倒排索引的時候讓我們先去了解一下什麼叫做正排索引 在說倒排索引之前我們先說說什麼是正排索引。正排索引也稱為 前向索引 它是建立倒排索引的基礎。這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙個新的索引塊,掛接在...
關於elasticsearch在系統架構中的位置
最近由於專案的原因,開始接觸到es。在使用和學習的過程中,不斷的產生著各種疑問讓我略顯迷茫。所以開始撰寫這篇部落格來記錄和推進自己對elasticsearch的學習。就現在而言,題目可能起的有點過於大。對於還並不算合格的程式設計師的我來說,談架構還為時尚早。但我希望在這篇文章終結的時候,自己能夠成長...
關於ElasticSearch的一些膚淺的思考
1.文章背景 初次研究elasticsearch,關於其中的 集群 節點 主分片 從分片 索引 型別 文件 字段 這幾個概念,分析它們之間的主從關係。通過閱讀文件以及檢視例項,有了一點自己的心得體會。現在此做一下描述,如有不確之處,歡迎批評指正。2.本文不做討論的內容 本文僅對於 集群 節點 主分片...