閱讀359 返回首頁    go 阿裏雲 go 技術社區[雲棲]


OpenSearch 使用二三事

先交代下我們的使用場景。我們是把一張分庫分表的邏輯表導入了 OpenSearch,建立了相關索引,供後台管理界麵查詢使用。最近在使用的過程中遇到了幾個問題。記之。

查詢的數據最多隻有 5000 條

我們有一個數據導出功能,當導出的數據超過 5000 條時,導出的表格裏就隻有 5000 條。我們使用的是 search 接口分頁查,看日誌發現當 startHit 到 5000 左右就返回失敗了。谘詢了下得知 search 接口為了保證能及時返回,當 startHit + hit > 5000 時就返回失敗了。如果需要獲取全量的數據需要用 scroll 接口。V3 可以參照這個來寫,scroll迭代查詢Demo,V2 的文檔不太完善,試了幾次才試出來。。。

query 子句長度不能超過 1k

我們的查詢頁麵需要按照多個維度來查詢,比如日期,發貨倉,到貨地等,而且都是多選,當日期跨度範圍比較大的時候,query 子句的日期部分是這樣的:

 timekey: "2017-06-01" OR  timekey: "2017-06-02” OR timekey: "2017-06-03” ...

當日期跨度比較大的時候發現查詢又失敗了。谘詢了下 Hooch,query 子句編碼後長度不能超過 1k,filter 子句長度不能超過 4k。然後教了我一種簡潔的寫法。

timekey:"2017-06-01"|"2017-06-02"|"2017-06-03” ...

然而隻是這樣還是不夠,日期隻是我的查詢條件之一,幾個條件加起來很容易超過 1k。比如到貨地,當按照某個行政級別(比如省)查詢時,需要把該級別和該級別下麵各級別的數據都篩選出來,如果也這樣遍曆的話很容易就超了。想過把部分條件放到 fitler 子句裏,但是 fitler 子句隻支持 “> <“ 這樣的過濾條件。另外想到的就是分多次查,但是分多次多個查詢條件怎麼拆分,還有怎麼做分頁,想想就覺得很痛苦。

繼續翻文檔的過程中,發現 OpenSearch 支持 “^31” 這樣的語法來查 31 開頭的數據(字段類型需是 SHORT_TEXT,分詞模式選模煳分詞),而地址 id 下級地址和上級地址的前綴又是一樣的,通過這種方式很容易匹配一個行政級別下麵的數據。同樣的思路,其他字段的查詢語句超長時,我也可以通過求公共前綴的方式來壓縮長度。

為什麼在使用 MySQL 的時候沒遇到過 sql 過長的問題

聯想了一下,對語句長度做限製應該是普遍存在的,為什麼在之前使用 MySQL 批量插入的時候沒遇到過類似問題。查了下,MySQL server 的max_allowed_packet 參數是限製接收到的包體長度的,默認值是 1M。

查詢有 doc 丟失

運營同學在使用過程中發現有時會丟失一些數據。繼續谘詢,得到的回複是這樣的

引擎更新文檔是一整篇更新,更新流程是 先 delete 再 add。所以會有一瞬間找不到文檔

這個問題目前沒有解決方法,記錄更新得越頻繁就越容易出現這種情況。對於“頻繁”沒有具體的參數值,但是一秒鍾有幾次更新的話會被認為頻繁。

最後,感謝 @Hooch 和 @本岩的答疑。

最後更新:2017-06-20 10:01:57

  上一篇:go  微服務架構實踐之郵件通知係統改造
  下一篇:go  RDS SQL Server - 專題分享 - 巧用執行計劃緩存之數據類型隱式轉換