跨索引查詢:
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、父子文檔存儲
優點:可以單獨更新父子文檔,但是相對而言查詢更慢。
缺點:父子關系結構改變,需要刪除所有內容