es 多索引關聯設計


 
 
跨索引查詢:
        ES的不同索引,索引結構相同的話是可以進行聯合查詢。如果索引結構不相同,字段名也不相同,無法做聯合查詢。
        通常不建議在es中做類似mysql的跨表join操作。在設計時,應盡可能的使用扁平化文檔模型,也就是在插入階段將跨表查詢的結果組成一個json插入到索引中。parent-child能實現部分結果,但是開銷很大,最好是將多個表中數組合並成一個json,提交到索引。
 
 
 
 
 
數據關聯查詢的實現方案:
 
1、應用端數據關聯
        實現方法:
                1、存儲時將數據分為獨立的兩個索引
                2、實際業務的時候,分兩次請求,然后將數據組合起來,返送給用戶,或者前端      
          
        適用場景:數據量少的業務場景。
        優點:數據量少時,用戶體驗好。
        缺點:數據量大,兩次查詢耗時肯定會比較長,影響用戶體驗。
        引申場景:關系型數據庫和ES 結合,各取所長。將關系型數據庫全量同步到 ES 存儲,不做冗余存儲。
        如前所述:ES 擅長的是檢索,而 MySQL 才擅長關系管理。所以可以考慮二者結合,使用 ES 多索引建立相同的別名,針對別名檢索到對應 ID 后再回 MySQL 查詢,業務層面通過關聯 ID join 出需要的數據。(我的理解,對於可能涉及到多個表關聯的實現,將數據量最大的用es索引數據,然后將余下的數據量少的讓mysql實現關聯,最后將es數據和mysql的關聯數據結合起來,一起返給客戶端)
 
2、寬表冗余存儲
            寬表冗余存儲的典型方案:將要使用join展示給用戶的數據,預先使用視圖關聯起來,然后同步視圖數據到es中。這里的視圖就是寬表。
 
          適用場景:一對多或者多對多關聯。
          優點:速度快。因為每個文檔都包含了所需的所有信息,當這些信息需要在查詢進行匹配時,並不需要進行昂貴的關聯操作。
          缺點:索引更新或刪除數據,應用程序不得不處理寬表的冗余數據;
          由於冗余存儲,導致某些搜索和聚合操作可能無法按照預期工作。
 
 
3、嵌套文檔(Nested)存儲
            嵌套文檔的本質也是將兩個不同索引的數據,合並到一個索引中。但與方法一不同的是,方法一是一條數據Join一條數據,而嵌套文檔中一條數據文檔,可能Join了多條數據文檔。典型實例如es官網上說的博客+評論,一個博客對應多條評論。博客是單一的數據,包括標題,內容等;但是評論卻有多條,包括用戶,年紀,性別等。而嵌套文檔就是為了處理一對多情況下,關於多的精確查詢(這里就是指評論的查詢),這里涉及到了es數據的存儲方式,可以參考一些說明。
            關於嵌套文檔,由於是將兩個索引文件合並成一個文件,因此在該索引中,如果對任意一個字段發生更改,添加或者刪除,均需要更新文件。
        使用場景:文檔偶爾更新的場合
        優點:速度快,因為文檔中包含了多有信息
        缺點:索引更新或刪除數據,需要重新提交文件,覆蓋舊的
        另外,關於nested類型的所有操作,均需要額外加一個nested關鍵字
 
4、父子文檔存儲
        
        優點:可以單獨更新父子文檔,但是相對而言查詢更慢。
        缺點:父子關系結構改變,需要刪除所有內容
        
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM