從工作中的一個問題看演算法的重要性

clz發表於2020-03-31
  1. 問題
    引數是開始和結束的時間,根據兩個日期維度來篩選es的資料,發現日期超過3個月後報錯,報錯如下

    {
    "error": {
     "root_cause": [
       {
         "type": "too_long_frame_exception",
         "reason": "An HTTP line is larger than 4096 bytes."
       }
     ],
     "type": "too_long_frame_exception",
     "reason": "An HTTP line is larger than 4096 bytes."
    },
    "status": 400
    }

    查詢的語句拼接如下,原來是根據天來拼接的多索引查詢(具體內容請忽略)

    GET /index_v1_20190801,index_v1_20190802,index_v1_20190803,index_v1_20190804,index_v1_20190805,index_v1_20190806,index_v1_20190807,index_v1_20190808,index_v1_20190809,index_v1_20190810,index_v1_20190811,index_v1_20190812,index_v1_20190813,index_v1_20190814,index_v1_20190815,index_v1_20190816,index_v1_20190817,index_v1_20190818,index_v1_20190819,index_v1_20190820,index_v1_20190821,index_v1_20190822,index_v1_20190823,index_v1_20190824,index_v1_20190825,index_v1_20190826,index_v1_20190827,index_v1_20190828,index_v1_20190829,index_v1_20190830,index_v1_20190831,index_v1_20190901,index_v1_20190902,index_v1_20190903,index_v1_20190904,index_v1_20190905,index_v1_20190906,index_v1_20190907,index_v1_20190908,index_v1_20190909,index_v1_20190910,index_v1_20190911,index_v1_20190912,index_v1_20190913,index_v1_20190914,index_v1_20190915,index_v1_20190916,index_v1_20190917,index_v1_20190918,index_v1_20190919,index_v1_20190920,index_v1_20190921,index_v1_20190922,index_v1_20190923,index_v1_20190924,index_v1_20190925,index_v1_20190926,index_v1_20190927,index_v1_20190928,index_v1_20190929,index_v1_20190930,index_v1_20191001,index_v1_20191002,index_v1_20191003,index_v1_20191004,index_v1_20191005,index_v1_20191006,index_v1_20191007,index_v1_20191008,index_v1_20191009,index_v1_20191010,index_v1_20191011,index_v1_20191012,index_v1_20191013,index_v1_20191014,index_v1_20191015,index_v1_20191016,index_v1_20191017,index_v1_20191018,index_v1_20191019,index_v1_20191020,index_v1_20191021,index_v1_20191022,index_v1_20191023,index_v1_20191024,index_v1_20191025,index_v1_20191026,index_v1_20191027,index_v1_20191028,index_v1_20191029,index_v1_20191030,index_v1_20191031,index_v1_20191101,index_v1_20191102,index_v1_20191103,index_v1_20191104,index_v1_20191105,index_v1_20191106,index_v1_20191107,index_v1_20191108,index_v1_20191109,index_v1_20191110,index_v1_20191111,index_v1_20191112,index_v1_20191113,index_v1_20191114,index_v1_20191115,index_v1_20191116,index_v1_20191117,index_v1_20191118,index_v1_20191119,index_v1_20191120,index_v1_20191121,index_v1_20191122,index_v1_20191123,index_v1_20191124,index_v1_20191125,index_v1_20191126,index_v1_20191127,index_v1_20191128,index_v1_20191129,index_v1_20191130,index_v1_20191201,index_v1_20191202,index_v1_20191203,index_v1_20191204,index_v1_20191205,index_v1_20191206,index_v1_20191207,index_v1_20191208,index_v1_20191209,index_v1_20191210,index_v1_20191211,index_v1_20191212,index_v1_20191213,index_v1_20191214,index_v1_20191215,index_v1_20191216,index_v1_20191217,index_v1_20191218,index_v1_20191219,index_v1_20191220,index_v1_20191221,index_v1_20191222/_search

    由於拼接的多索引過長導致錯誤,怎麼解決呢?

  2. 尋找解決方案

    • 解決方案1,調節引數配置,但是正式版的es叢集不好重啟,方案pass
    • 解決方案2,用別名的形式,請求前將長日期索引建立一個別名,然後用別名查詢,還有更好的方案嗎?
    • 解決方案3,使用通配索引,如index_v1_201912*查詢整個12月的,index_v1_2019*查詢整個19年的,這個是比較好的方案,決定試一下。
  3. 具體實施

    要實現的功能是,封裝一個函式,引數是開始時間和結束時間,返回值是對應的通配匹配,比如引數是20191130和20200101,則返回值應該是20191130,201912*,20190101

    待更新

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章