【FusionInsight Elasticsearch二次開發最佳實踐】查詢優化

      網友投稿 932 2025-03-31

      1.1 使用更快的硬件

      查詢性能大部分場景下更多的在于IO能力,很多時候查詢速度受限于磁盤IO能力,使用SSD會比旋轉類存儲介質好得多。

      如果查詢類型屬于計算比較多的,則可以考慮使用更快的CPU。

      1.2 為文件系統cache預留足夠的內存

      在一般情況下,讀寫都會被操作系統cache,cache保存在系統物理內存中。命中cache可以降低對磁盤的直接訪問頻率。查詢依賴對cache的命中,如果某個請求需要從磁盤讀取數據,則一定會產生相對較高的延遲。

      應該至少為系統cache預留一半的可用物理內存,更大的內存有更高的cache命中率。

      1.3 Mappings優化

      請確認mappings設置是否合理。

      1.???????? 對于只需要精確查詢的字段,例如時間戳,應該設置為keyword。

      2.???????? 對需要進行全文檢索的字段設置合理的分詞器,不同的分詞器查詢效率相差較大。

      1.4 強制段合并歷史索引

      為不再更新的歷史索引執行force merge,講Lucene索引合并為單個分段,可以提高查詢速度。當一個Lucene索引存在多個分段時,每個分段會單獨執行查詢再講結果合并,將只讀索引強制合并成一個Lucene分段不僅可以優化查詢過程,對索引恢復速度也是有好處的。

      curl -XPOST --tlsv1.2 --negotiate -k -u : 'https://ip:httpport/_all/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'

      1.5 過濾查詢(filter)

      elasticsearch的查詢操作分為2種:查詢(query)和過濾(filter),查詢(query)默認會計算每個返回文檔的得分,然后根據得分排序;而過濾(filter)只會篩選出符合的文檔,并不計算得分,且可以緩存文檔。

      對于非全文檢索的使用場景,如果不關心查詢結果和查詢條件的相關度,只是想查找目標數據,可以使用filter來提高查詢效率。

      1.6 路由(routing)

      elasticsearch寫入文檔時,文檔會通過一個公式路由到一個索引中的一個分片上。默認公式如下:

      【FusionInsight Elasticsearch二次開發最佳實踐】查詢優化

      shard_num = hash(_routing) % num_primary_shards

      _routing字段的取值,默認是_id字段,可以根據業務場景設置經常查詢的字段作為路由字段。例如可以考慮將用戶id、地區作為路由字段,查詢時可以過濾不必要的分片,加快查詢速度。

      1.7 游標查詢(scroll)

      Elasticsearch為了避免深分頁,不允許使用分頁(from&size)查詢10000條以后的數據,需要使用游標(scroll)查詢。

      優化scroll:在一般場景下,scroll用來取得排序好的大量數據,但很多時候只需要返回數據,這時候可以對scroll進行優化。使用_doc去sort返回的結果不會有排序,此時執行效率最快。

      1.8 避免使用wildcard模糊匹配查詢

      Elasticsearch默認支持通過*?正則表達式來做模糊匹配,數據量級別達到TB+甚至更高之后,模糊匹配查詢通常會耗時比較長,甚至可能導致內存溢出,卡死乃至崩潰宕機的情況。所以數據量大的情況下,不要使用模糊匹配查詢。

      1.9 調節查詢請求中的batched_reduce_size

      該字段是查詢請求中的一個參數。默認情況下,聚合操作在協調節點需要等待所有的分片都取回結果后才執行,使用batched_reduce_size參數可以不等待全部分片返回結果,而是在指定數量的分片返回結果之后就可以先處理一部分(reduce)。這樣可以避免協調節點在等待全部結果的過程中占用大量內存,避免極端情況下可能導致OOM。該字段的默認值為512。

      1.10 使用自適應副本選擇(ARS)

      為了充分利用計算資源和負載均衡,協調節點將查詢請求輪詢轉發到分片的每個副本,輪詢策略是負載均衡過程中最簡單的策略。

      Elasticsearch實現了可以評估出副本所在節點的壓力和健康程度,這就可以讓我們選出一個能夠更快返回搜索請求的節點??梢酝ㄟ^命令動態開啟:

      cluster.routing.use_adaptive_replica_selection:true

      1.11 聚合查詢優化

      大多時候對單個字段的聚合查詢還是比較快的,但是當需要聚合多個字段時,就會產生大量的分組,最終結果就是占用Elasticsearch大量的內存,從而導致內存溢出的情況發生。盡量根據業務優化,減少聚合次數。

      1.11.1 默認深度優先聚合改為廣度優先聚合

      添加設置:"collect_mode": "breadth_first"。

      depth_first? :直接進行子聚合的計算。

      breadth_first? :先計算出當前聚合的結果,針對這個結果在對子聚合進行計算。

      1.11.2 優化聚合執行方式

      在每一層terms aggregation內部加一個 “execution_hint”: “map”。

      添加設置:"execution_hint": "map"。

      1.???????? 查詢結果直接放入到內存中構建map,在查詢結果集小的場景下,速度極快;

      2.???????? 但如果查詢結果集合很大(百萬-億級別)的時候,傳統聚合方式會比map方式快。

      1.11.3 預熱全局序號

      全局序號是一種數據結構,用于在keyword字段上運行terms聚合。它用一個數值來代表字段中的字符串值,然后為每一個數值分配一個bucket。這需要一個對全局序號和bucket的構建過程。默認情況下,它們被延遲構建,因為Elasticsearch不知道哪些字段將用于terms聚合,哪些字段不會??梢酝ㄟ^配置mapping在refresh時告訴Elasticsearch預先加載全局序號:

      "mappings":?{? ?"type":?{? ?"properties":?{? ?"foo":{? ?"type":?"keyword",? ?"esager_global_ordinals":true }? ?}? ?}? ?}

      FusionInsight Elasticsearch EI企業智能

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel如何設置輸入時自動標注顏色
      下一篇:Excel中不用函數提取數字和文本中數字的操作方法(不規則文本中提取數字用什么函數)
      相關文章
      亚洲精品无码久久久久去q| 亚洲国产一区视频| 日本亚洲欧洲免费天堂午夜看片女人员 | www.亚洲精品| 亚洲综合激情五月色一区| 亚洲人成在久久综合网站| 久久久久亚洲精品日久生情 | 亚洲精品无播放器在线播放 | 亚洲综合激情五月色一区| 亚洲熟妇AV一区二区三区宅男| 亚洲欧洲日本在线观看| 亚洲视频无码高清在线| 亚洲一线产品二线产品| 亚洲老熟女五十路老熟女bbw| 亚洲永久网址在线观看| 久久久久亚洲AV无码去区首| 亚洲成AV人影片在线观看| 亚洲av无码专区首页| 婷婷综合缴情亚洲狠狠尤物| 国产成人+综合亚洲+天堂| 亚洲麻豆精品国偷自产在线91| 亚洲人成无码www久久久| 亚洲欧洲精品成人久久奇米网| 国产精品亚洲综合专区片高清久久久| 亚洲人午夜射精精品日韩| 亚洲中文字幕第一页在线| 亚洲av永久无码精品漫画| 亚洲男人天堂2017| 91亚洲性爱在线视频| 亚洲性色精品一区二区在线| 亚洲a∨无码精品色午夜| 亚洲阿v天堂在线2017免费| 国产亚洲精品高清在线| 亚洲春色在线视频| 亚洲网站在线播放| 亚洲大成色www永久网址| 亚洲av综合日韩| 国产亚洲精品自在线观看| 亚洲ⅴ国产v天堂a无码二区| 亚洲手机中文字幕| 亚洲av无码成人精品国产|