子句說明
Searcher Cache對searcher上request的最終查詢結果(精排或者打散后的結果)進行緩存,減少重復的query的粗排和精排計算量,提高單個searcher的處理能力。對于某個request的結果是否應該進cache,以及該request對應的cache結果如何失效等策略都是和具體業務邏輯緊密相關的,Searcher Cache允許用戶在配置和查詢串中對不同的策略進行開關設定,結合ha3的插件機制可以靈活的定制各種用戶對cache的業務需求。
子句語法
{
"cache" : {
}
}
參數說明:
enabled:指定是否進Searcher Cache的開關,其值可以為:true 或者 false
cache_key:指定當前request的key,這個key由用戶生成并在request指定。key的選擇和生成策略會影響Searcher Cache的命中率,每個應用應該根據具體的使用場景和業務特點來選擇生成合適的key,來保證Searcher Cache的命中率。如果么有填默認對整個request進行hash作為cache的key。
expire_time:request在Searcher Cache中的對應的item都是有一個過期時間,確保結果的時效性。過期時間的設定是和具體應用密切相關的,如果應用不關心結果的時效性或者沒有增量更新的情況下甚至可以忽略expire_time的指定,默認是該request對應的item永不過期,直到cache的lru策略將其移除。expire_time是一個ha3支持的任意表達式(attribute expression, function expression, virtual attribute expression以及有前三者組成的算數表達式),返回值必須類型為uint32,否則報錯,expirte_time所指定的過期時間的單位是s。Searcher Cache內部,在將request的查詢結果放進cache之前,會使用expire_time表達式為結果中的每個doc計算一個過期時間,然后取最小的過期時間作為該request對應的整個cache結果的過期時間。
current_time:如果request指定了cur_time,則Searcher Cache通過比較item的過期時間和cur_time來判斷當前request對應的item是否超時時;如果沒有指定cur_time則過期時間與系統的當前時間進行比較。
cache_filter:用戶可以通過指定cache_filter來對cache中的結果進行過濾,過濾語法和普通的filter相同。
cache_doc_num_limit:指定request的查詢結果進cache的doc數,為了得到更好的cache 命中率,需要在每個查詢中指定。默認值為 [200, 3000], 可以配置成多級的[100, 200, 300]。例如當配置為"cache_doc_num_limit": [280, 780]時,這時cache 文檔的策略為:searcher 中的required_topK <= 280時,cache緩存280個doc;當280 < requried_topK <= 780時,緩存780個doc;required_topK > 780時,保留required topK個文檔。
refresh_attributes: 指定cache命中時刷新的attribute,目前只支持schema中attribute,不支持virtual_attribute。cache結果存在時間較長時,某些attribute的值可能已經被實時更新了,因此cache中的結果無法保證時效性,開啟此項功能可使得這些attribute總是使用最新值,從而保證時效性。
示例:
{
"cache" : {
"enabled" : true,
"cache_key" : 1234567890,
"expire_time" : "now()+300",
"current_time" : 1235,
"cache_filter" : "a > 10",
"cache_doc_num_limit" : [200, 3000],
"refresh_attributes": ["price", "sell_count"]
}
}
注意事項
searcher_cache是可選子句。
當前采用的Cache 文檔個數策略與searcher上required topK相關。這個required topK與request中的start + hit值相關。當存在多個searcher時,QRS會對每個searcher返回的文檔個數做限制,主要通過searcher_return_hits來限制。所以searcher上的required top值為:min(start+hit, searcher_return_hits)。
Searcher Cache緩存的是精排后的結果,為了保證有足夠的結果進cache,必須使得有相應數目的結果能在精排后被留下來,可以在rerank scorer中指定rank_size或者request中的config子句指定rerank_size。