閱讀837 返回首頁    go 新東方


搜索__性能篇_最佳實踐_開放-阿裏雲

這裏主要介紹在實際查詢過程中可能遇到的各種情況,及可以優化的方法。當您發現自己的搜索效果不滿意或者不知道該如何實現,請聯係我們。

搜索查詢的效果主要跟query關鍵詞中命中的文檔數有關,命中的文檔數越多,係統要進行的計算就越多,那麼耗時就會越高。所以優化的一個重要手段就是盡量降低query召回的文檔數。

  1. 查詢需要帶上索引名(應用結構中的“索引到”字段),否則將默認取default索引,如果沒有default,則直接報錯無結果。
    1. query='mp3'相當於query=default:'mp3'
  2. 查詢關鍵詞必須帶上單引號,否則很可能會報錯無結果。
    1. Error: query=default:mp3
    2. Right: query=default:'mp3'
  3. 如果查詢詞中包含’,則需要轉義或者去掉;2,查詢詞的最後一個字符不能是’’,否則會被當成轉義符從而查詢報錯,如果要搜索’’,需要對’’進行轉義。
    1. query=default:'北京大學',召回同時包含“北京”和“大學”的文檔;
    2. query=default:'abc's efg'會解析失敗無結果,需要修改為'abc's efg';
    3. query=default:'abc',會查詢報錯無結果,對'進行了轉義,到時引擎解析失敗;
  4. 對於隻用來做過濾篩選的需求,建議盡量將過濾字段建索引,通過query子句來查詢,可以提高性能。
    1. query=user_id:'123'&&filter=type_id=1,改寫為query=user_id:'123' AND type_id:'1'。
  5. 如果某些query召回量非常大,那麼檢索的效果低很多,這時候放在filter中可能效果更好。
    1. query=status:'1' AND user_id:'123' //符合user_id=123的有100條記錄,符合status=1的有5kw文檔,
    2. 改寫為
    3. query=user_id:'123'&&filter=status=1 //這樣召回量會小很多,通過filter來過濾會更快。
  6. 在一些情況下,會查詢近一個月的數據,目前係統不支持query的range查詢,如果數據量較大,性能比較差,可以考慮增加一個月份字段,適當降低query的召回文檔量,可以有效提高查詢效率。
    1. query=user_id:'123'&&filter=time>"2016-09-16" //符合user_id=123的有5千萬數據,但是根據時間過濾完隻有1千。query召回量太大,很容易超時
    2. 可以改為:
    3. query=user_id:'123' AND (month:'201610' OR month:'201609')&&filter=time>"2016-09-16" //這樣符合user_id:'123' AND (month:'201610' OR month:'201609')的隻有2000,再做具體時間過濾效率會高很多。
  7. 查詢到具體的文檔後,引擎會去獲取實際要返回的結果數據,如果結果數據較大,那麼消耗的時間也會越大。這時,可以從哪個方麵入手:1,降低hit數,一般翻頁結果為20個;2,修改默認展示字段或者fetch_fields,僅返回搜索結果展示中需要的字段即可。

最後更新:2016-11-23 17:16:06

  上一篇:go 數據推送__性能篇_最佳實踐_開放搜索-阿裏雲
  下一篇:go 開源建站工具對接OpenSearch__工具篇_最佳實踐_開放搜索-阿裏雲