1. 程式人生 > >solr查詢優化(實踐了一下效果比較明顯)

solr查詢優化(實踐了一下效果比較明顯)

什麼是filtercache?

    solr應用中為了提高查詢速度有可以利用幾種cache來優化查詢速度,分別是fieldValueCache,queryResultCache,documentCache,filtercache,在日常使用中最為立竿見影,最有效的應屬filtercache,何謂filtercache?這個需要從一段solr的查詢日誌開始說起,下面是我擷取的solr執行中列印的一段查詢日誌:

[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 2                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A411%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 2                  
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 2                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A8059%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 0                 
[search4alive-0] Request_is ==> debugQuery=on&group=true&group.field=group_id&group.ngroups=true&group.sort=gmt_create+desc&q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+ha
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=30&rows=30,queryTime_is ==> 4                                    
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A1+AND+class_id%3A1+AND+%28group_id%3A375%29&sort=gmt_create+desc&start=0&rows=20,queryTime_is ==> 3                  
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 4                                     
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=5,queryTime_is ==> 1                                      
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 4                                     
[search4alive-0] Request_is ==> q=status%3A0++AND+biz_type%3A2+AND+class_id%3A1&sort=index_sort_order+desc&start=0&rows=30,queryTime_is ==> 3                                     

   看到這段查詢日誌之後,我們開始考慮如何提升查詢的rt(查詢速度),因為在引數q中的查詢是要有磁碟IO開銷的,很自然的思路是將整個查詢的引數q作為key對應的結果作為value,這樣做是可以的,但是查詢的命中率會很低,會佔用大量記憶體空間。

   查詢引數q上基本上每次都會出現status,biz_type,class_id 對於這樣的字查詢,所以可以把整個查詢條件分成兩部分一部分是以status,biz_type,class_id 這幾個條件組成的子查詢條件,另外一部分是除這三個條件之外的子查詢。在程序查詢的時候,先將status,biz_type,class_id 條件組成的條件作為key,對應的結果作為value進行快取,然後再和另外一部分查詢的結果進行求交運算。

       通過上面這幅圖明白了filtercache的意義是,將原先一個普通查詢分割成兩個組合查詢的與運算,兩個子查詢至少有一個使用快取,這樣既減少了查詢過程的IO操作,又控制了快取的容量不會消耗過多的記憶體。

如何使用?

首先要配置solrconfig.xml 要開啟fltercache:

Xml程式碼  收藏程式碼
  1. <query>
  2.         <filterCacheclass="solr.LRUCache"size="50000"initialSize="512"autowarmCount="0"/>
  3. </query>

 這裡使用的是solr實現的基於LRU演算法的緩實現,以上配置是使用solr.LRUCache ,使用這個cache在插入多,查詢少的情況比較使用,如果是查詢多,插入少

的情況,可以使用solr.FastLRUCache快取模組。

客戶端API呼叫:

下面是原先的客戶端端查詢程式碼:

Java程式碼  收藏程式碼
  1. SolrQuery query = new SolrQuery();  
  2. query.setQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123");  
  3. QueryResponse response = qyeryServer.query(query);  

使用filterQuery之後的查詢程式碼:

Java程式碼  收藏程式碼
  1. SolrQuery query = new SolrQuery();  
  2. query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1");  
  3. query.setQuery("xxx:123");  
  4. QueryResponse response = qyeryServer.query(query);  

經過測試這樣優化之後,查詢的RT(查詢速度)會明顯減小,QPS(每秒查詢率)會有明顯提升。

使用filterquery過程中需要注意點:

●不能在filterQuery 上重複出現query中的查詢引數,如果上面的filterquery呼叫方法如下所示:

Java程式碼  收藏程式碼
  1. query.addFilterQuery("status:0 AND biz_type:1 AND class_id:1 AND xxx:123");  
  2. query.setQuery("xxx:123");  

 如上,條件xxx:123 在filterQuery和query上都出現了,這樣的寫法非但起不到查詢優化的目的,而且還會增加查詢的效能開銷。

●儘量減少呼叫addFilterQuery方法的次數

Java程式碼  收藏程式碼
  1. query.addFilterQuery("status:0 ");  
  2. query.addFilterQuery("biz_type:1 ");  
  3. query.addFilterQuery("class_id:1 ");  
  4. query.setQuery("xxx:123");  

如上,將status:0 AND biz_type:1 AND class_id:1 這個組合查詢條件,分三次呼叫filterQuery方法來完成,這樣的呼叫方法雖然是正確的,並且能起到效能優化的效果,優化效能沒有呼叫一次addFilterQuery方法來得高,原因是多呼叫了兩次addFilterQuery,就意味著最後需要多進行兩次結果集的求交運算,雖然結果集求交運算速度很快,但畢竟是有效能損耗的。

不過從記憶體開銷的角度來說,呼叫三次addfilterQuery方法這樣可以有效降低記憶體的使用量,這個是肯定的。所以在是否呼叫多次addFilterQuery方法的原則是,在記憶體開銷允許的前提下,將量將所有filterQuery條件,通過呼叫有限次數的addFilterQuery方法來完成。

下文摘自solr中國

What it is used for?

先從內部機制開始。FilterCache儲存了一些無序的文件標識號(ID)。這些ID並不是我們在schema.xml裡配置的unique key,而是solr內部的一個文件標識。請記住這個。

FilterCache的任務是保持與使用者過濾的結果關聯。另外,cache可以輔助facet機制(在使用TermEnum時),在solrconfig.xml中的<useFilterForSortedQuery/>引數設為true時,還可以進行排序。

Definition
FilterCache的標準定義如下:

Xml程式碼
  1. <filterCache
  2.     class=”solr.FastLRUCache”
  3.     size=”16384″
  4.     initialSize=”4096″
  5.     autowarmCount=”4096″ />

有以下的配置可供選擇:
class:實現類。建議使用solr.FastLRUCache,它能在大量的GET、PUT操作下,提供更好的效能。
size:cache的最大值。
initialSize:cache的初始化值。
autowarmCount:從舊的cache到新的cache時,需要被複制的數量。
minSize:在full restoraton的情況下,將cache減小後的值
acceptableSize:如果minSize沒有設定,則該值會替代之
cleanupThread:預設false,如果設為true則會使用一個分離的topic來清理cache。

大部分情況下,設定initialSize和autowarmCount就已經足夠了。

How to configure?
cache的大小,需要根據基本的查詢語句而定;maximum大小應該至少等於我們使用的過濾欄位的大小。舉個例子說明:如果在某個時間內,你的應用程式使用了2000個查詢引數,則minimum的大小應該最小設為2000。

Efficient use
然而,光有配置是不夠的,我們還需要讓查詢能夠使用它。請看下面的例子:

  1. q=name:solr+AND+category:ksiazka+AND+section:ksiazki

初看起來,查詢語句是正確的。但是有個問題:它並沒有用到filterCache。所有的請求將會繫結到queryResultCache中並建立一個單獨的條目。我們來作一下修改:

  1. q=name:solr&fq=category:ksiazka&fq=section:ksiazki
  2. 對應java程式碼:
  3.     SolrQuery query = new SolrQuery();  
        
        query.addFilterQuery("category:ksiazka");
        query.addFilterQuery("section:ksiazki");  
        query.setQuery("name:solr");  
          
        QueryResponse response = qyeryServer.query(query);  


有什麼變化呢?在這個例子中,一個條目會寫入到queryResultCache中;另外,還會有兩個條目會寫入到filterCache中。現在看一下下面的語句:

  1. q=name:lucene&fq=category:ksiazka&fq=section:ksiazki

這個查詢會建立一個條目到queryResultCache中,但是會使用filterCache中兩個已經存在的條目。這樣查詢的執行時間會降低,IO的使用也會節省。

然而,對於下面的查詢:

  1. q=name:lucene+AND+category:ksiazka+AND+section:ksiazki

solr不能使用任何cache並且需要從lucene索引中收集所有的資訊。

Last few words
就像你所看到的,配置cache 的正確方法不是如何保證solr能夠使用它,而是如何構建查詢語句來提升效能。當考慮查詢的時候,請考慮這一點。


相關推薦

solr查詢優化實踐一下效果比較明顯

什麼是filtercache?     solr應用中為了提高查詢速度有可以利用幾種cache來優化查詢速度,分別是fieldValueCache,queryResultCache,documentCache,filtercache,在日常使用中最為立竿見影,最有效的應屬f

mac securecrt無法記住密碼的解決方法 一下,靠譜

一、問題描述 mac有自帶的終端,可以執行ssl和sftp,但是目錄操作,檔案操作和檔案上傳是分開的,很不方便,並且檔案上傳命令需要檔案的全路路徑。 使用securecrt能方便的解決上述的問題,並且檔案上傳採用選擇檔案的方式。但是由於有多個伺服器需要連線和管理,

Mac 上sshd 服務啟用------便於用在mac上用securecrt連線mac自己 一下,靠譜

   scp (Secure copy) 命令相信 同學們都知道。今天我想從我的一臺同區域網內的Linux 機器上拷貝幾個檔案到我的的機上來。突然想到,mac 畢竟不是 linux, sshd 服務預設沒有啟動的可能性很大。        到底有沒有 sshd 服務

SecureCRT安裝一下,靠譜

   第一步下載 SecureCRT安裝包和破解指令碼 破解指令碼 securecrt_mac_crack.pl安裝包scrt-7.3.7-1034.osx_x64.dmg 雙擊安裝包  先點選agree,然後會跳出一個視窗,再把視窗中的檔案複製到

MySQL索引原理及慢查詢優化轉自:美團tech

輔助 nor bundle like 案例 應對 異常 線下 重要 背景 MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位

MySQL索引原理及慢查詢優化

範圍 很難 等於 right 事件 原理 插入 jpg 個人網站 轉自:美團點評技術團隊http://tech.meituan.com/mysql-index.html MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性

ES 查詢優化

1、能用term就不用match_phrase The Lucene nightly benchmarks show that a simple term query is about 10 times as fast as a phrase query, and about 20 ti

機房收費系統——組合查詢優化新增DTPicker控制元件

乾貨 組合查詢窗體中查詢欄位有日期有時間,那這樣我們還用文字框來顯示的話是不是使用者體驗很不好,本著提升使用者體驗的想法把文字框換成DTPicker控制元件。下面看看效果和怎麼實現的。 功能是當點選需

MySQL優化系列--查詢優化1非索引設計

一、明確搜尋優化的整體思路以及查詢優化的因素: (1)搜尋優化的整體思路: 索引優化,查詢優化,查詢快取,伺服器設定優化,作業系統和硬體優化,應用層面優化(web伺服器,快取)等等。對於一個整體專案而言只有這些齊頭並進,才能實現mysql高效能。 (2)查詢優化的因素思路:

索引原理與慢查詢優化2

不難 設置 本地 保持 建立 名稱 三次 執行計劃 慢查詢日誌 七 正確使用索引 一 索引未命中 並不是說我們創建了索引就一定會加快查詢速度,若想利用索引達到預想的提高查詢速度的效果,我們在添加索引時,必須遵循以下問題 1 範圍問題,或者說條件不明確,條件中出現這些符號或關

MySQL優化系列--查詢優化1非索引設計

接下來這篇是查詢優化,使用者80%的操作基本都在查詢,我們有什麼理由不去優化他呢??所以這篇部落格將會講解大量的查詢優化(索引以及庫表結構優化等高階用法後面文章再講),先講單表查優化,再講多表查優化。

MySQL優化系列--查詢優化2外連線、多表聯合查詢以及查詢注意點

繼續這一系列,上篇的簡單查詢優化並沒講完,第二點還有查詢注意點以及多表查詢優化呢!! 文章結構:(1)多表查詢步步優化;(2)查詢編寫的注意點。 /* 補充說明(往後有博友反饋的話,會繼續補充。) */ 一、2017-7-19: 關於“超大

MySQL索引原理及慢查詢優化重要

該文是我看過mysql索引和優化相關知識,講解最全面的一篇博文(是美團內部的一篇技術博文),現轉載分享給大家,希望大家能從中有所收穫! MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,

MYSQL一次千萬級連表查詢優化

概述: 交代一下背景,這算是一次專案經驗吧,屬於公司一個已上線平臺的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的SQL查詢變得越來越慢,使用者體驗特別差,因此SQL優化任務交到了我手上。 這個SQL查詢關聯兩個資料表,一個是攻擊IP使用者表主

hdu 1003 Max Sum(最大連續子序列和) 一下分治

都不知道以前刷杭電是怎麼做的最大連續子序列和,仔細一想,我以前好像是dp寫的, 然後現在再來寫居然發現不能快速寫出來了。。 真是坑啊。。 看了自己以前寫的最大連續子序列和的程式碼, 真的是讓我噁心死了。。  程式碼風格慘不忍睹 前兩天在大白書看到最大連續子序列和可以用分治去

MySQL慢查詢優化線上案例調優

## 文章說明 這篇文章主要是記錄自己最近在真實工作中遇到的慢查詢的案例,然後進行調優分析的過程,歡迎大家一起討論調優經驗。(以下出現的表名,列名都是化名,實際資料也進行過一點微調。) PS:最近做了一個面試題精選精答的開源專案,如果想要了解更多MySQL相關的技術總結,可以看一看,如果對大家有幫助,希望大家

自定義一個更好用的SwipeRefreshLayout彈力拉伸效果詳解轉載

dsc drag 常數 lane swipe loading 數據改變 高中數學 tca 轉自: 自定義一個更好用的SwipeRefreshLayout(彈力拉伸效果詳解) 前言 熟悉SwipeRefreshLayout的同學一定知道,SwipeRefreshLayout是

MySQL 基礎數據類型優化如何選擇數據類型

高性能 amp 處理 字節 方便 集合 arc 大數 back 前言: 最近在看高性能 MySQL,記錄寫學習筆記: 高性能 MySQL 學習筆記(二) Schema與數據類型優化 筆記核心內容:MySQL 如何選擇正確的數據類

Ubuntu清理內存命令效果明顯

blank use http ubuntu 緩存 proc clas tar div 註意:最好不要在生產環境上使用!!! 1、檢查內存使用情況 watch -n 3 free -m watch -n 3 cat /proc/meminfo

楊氏矩陣查詢數字遞迴和非遞迴

楊氏矩陣  有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 要求:時間複雜度小於O(N);  例:  1 2 3          4 5 6