日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

發布時間:2025/3/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是 ES Nested 嵌套

Elasticsearch 有很多數據類型,大致如下:

  • 基本數據類型:
    • string 類型。ES 7.x 中,string 類型會升級為:text 和 keyword。keyword 可以排序;text 默認分詞,不可以排序。
    • 數據類型:integer、long 等
    • 時間類型、布爾類型、二進制類型、區間類型等
  • 復雜數據類型:
    • 數組類型:Array
    • 對象類型:Object
    • Nested 類型
  • 特定數據類型:地理位置、IP 等

注意:tring/nested/array 類型字段不能用作排序字段。因此 string 類型會升級為:text 和 keyword。keyword 可以排序,text 默認分詞,不可以排序。

更多Java微服務資料,加我微w信x:bysocket01 (加的人,一般很帥)

2.1 那什么是 Nested 類型?

Elasticsearch 7.x 文檔中,這樣寫到:

The nested type is a specialised version of the object datatype that allows arrays of objects to be indexed in a way that they can be queried independently of each other.


Nested (嵌套)類型,是特殊的對象類型,特殊的地方是索引對象數組方式不同,允許數組中的對象各自地進行索引。目的是對象之間彼此獨立被查詢出來。

2.2 如何使用 Nested 類型?

在 ES 的 my_index 索引中存儲 users 字段。比如說

{"group" : "fans","users" : [{"name" : "John","age" : "23"},{"name" : "Alice","age" : "18"}] }

其實存儲看上去跟 Object 類型一樣,只不過底層原理對數組 users 字段索引方式不同。設置 users 字段的索引方式 Nested 嵌套類型:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' {"mappings": {"properties": {"users": {"type": "nested" }}} } '

二、Nested Query 應用場景或案例

比如小老弟我有一波小粉絲,users 字段類型是 object。存儲如下:

{"group" : "bysocket_fans","users" : [{"name" : "John","age" : "23"},{"name" : "Alice","age" : "18"}] }{"group" : "路人甲_fans","users" : [{"name" : "Alice","age" : "22"},{"name" : "Jeff","age" : "18"}] }

比如 18 歲大姑娘 Alice 是小老弟我的粉絲,她也可能是周杰倫的粉絲。那這邊就有一個需求,即應用場景:

如何找到 18 歲大姑娘 Alice {"name" : "Alice","age" : "18"} 關注的所有明星呢?如果用老的查詢語句是這樣搜索的:

GET /my_index/_search?pretty {"query": {"bool": {"must": [{"match": {"users.name": "Alice"}},{"match": {"users.age": 18}}]}} }

結果發現結果是不對的,路人甲 這條記錄也出現了。因為匹配到了第一個 Alice + 第二個 Jeff 的 18。所以這種查詢不滿足這個場景

那么需要使用 Nested 類型并用 Nested 查詢,即讓數組中的對象各自地進行索引。目的是對象之間彼此獨立被查詢出來。

三、Nested Query 實戰


3.1 設置 Nested 類型

根據 2.2 如何使用 Nested 類型,將 users 字段類型從 object 修改為 nested:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' {"mappings": {"properties": {"users": {"type": "nested" }}} } '

3.2 Nested Query

修改后,對應的 Nested Query ,如下:

GET /my_index/_search?pretty {"query": {"bool": {"must": [{"nested": {"path": "users","query": {"bool": {"must": [{"match": {"users.name": "Alice"}},{"match": {"users.age": 18}}]}}}}]}} }


語法很簡單就是:

  • key 以 "nested" 開頭
  • path 就是嵌套對象數組的字段名
  • 其他
    • score_mode (可選的)匹配子對象的分數相關性分數。avg (默認,使用所有匹配子對象的平均相關性分數)
    • ignore_unmapped (可選的)是否忽略 path 未映射,不返回任何文檔而不是錯誤。默認為 false,如果 path 不對就報錯

這樣查詢得結果就是對的。

四、Nested Query 性能

這邊測試過,給大家一個測試報告和建議。

壓測環境:3 個 server ,6 個 ES 節點
壓測結論: 使用上小節查詢語句,50 并發情況下,導致千兆網卡被打滿了。TPS 4000 左右,如果提高并發,就會增加 RT。所以如果高性能大流量情況下,必須用 Nested 應該從網絡流量方向進行優化。二者,盡量減少大數據對象的返回

建議:泥瓦匠建議,你聽聽看

  • 性能:Common Query 遠遠大于 Nested Query 遠遠大于 Parent/Child Query
  • 性能優化:首先考慮減少后面兩種 Query
  • 性能優化:Nested Query 業務可以優化下。比如上一小節完全可以多存一個 fanIds 數組。搜索兩次,第一次查確定 18 歲大姑娘 Alice 的 fanId,第二次根據 fanId 搜索即可
  • 性能優化:實在沒辦法,高性能大流量情況下,必須用 Nested 應該從網絡流量方向進行優化。二者,盡量減少大數據對象的返回

(完)

參考資料:

  • https://blog.csdn.net/laoyang360/article/details/82950393
  • https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-aggregations-bucket-reverse-nested-aggregation.html
  • 更多Java微服務資料,加我微w信x:bysocket01 (加的人,一般很帥)

總結

以上是生活随笔為你收集整理的嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。