solr使用規範

0. 目的

規範solr設計、用法,避免bug,提高性能

1. 設計規範

  • solr的用途是查詢,不是存儲,建議查詢結果儘量都爲id主鍵,而後再拿該id主鍵到緩存或者db中再查詢相關信息,例如:請勿將經銷商名稱、車型名稱等各類非Id信息放到solr。
  • 索引字段只用來查詢等價於sql中的where/group/join等字段,所以index都得爲true,不需要展示的字段可以將store設置爲false,以減小io及存儲。

2. 開發規範

2.1 原則禁止模糊查詢

優先考慮通過分詞查詢(線上solr默認支持ik分詞)來滿足需求。如果使用模糊查詢,務必避免使用多個*,超過1個請通知我們,或許有更好的方案,並防止意外風險。原因爲:過多的*會嚴重降低solr查詢性能,由於lucene本身的問題,曾經導致線上solr實例內存溢出。

2.2 設置真實的rows或group.limit值

rows值建議根據實際情況設置,例如:查詢結果最多100條,rows沒必要設置爲1000,禁止使用int.maxvalue之類的設置,建議業務方根據自己的業務場景,估計是最大值;當rows>2000,請做好壓力測試,並通知我們。
group.limit同理。
原因: 同禁止模糊查詢

2.3 頁碼過大時,請慎重

分頁值如果比較大,例如1000萬條數據,每頁10條,隨着pageIndex值的增大,solr查詢性能會逐步降低,如果pageIndex非常大,例如超過1萬,性能會比較慢。可以和產品商量,1)大於某個閥值的時候,考慮設置爲一個隨機數;2)設置最大的頁碼,例如:1000頁,防止抓包工具惡意掃描。

2.4 確保HttpSolrClient/HttpSolrServer單例

源碼:

      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 128);
      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 32);
      params.set(HttpClientUtil.PROP_FOLLOW_REDIRECTS, followRedirects);

通過上述代碼表明一個HttpSolrClient/HttpSolrServer佔用多個tcp連接,如果不是單例,則連接數會倍增,線上虛擬機出現過佔用鏈接過多導致資源不夠用的OOM。

2.5 solr 隨機排序

solr支持,用法如下:

# schema配置
<dynamicField name="rand*" type="random" indexed="true" stored="false"/>
# solrj查詢語法
query.addSort("rand_"+randomNum, ORDER.desc);//隨機排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章