searcher_cache子句

子句说明

Searcher Cache对searcher上request的最终查询结果(精排或者打散后的结果)进行缓存,减少重复的query的粗排和精排计算量,提高单个searcher的处理能力。对于某个request的结果是否应该进cache,以及该request对应的cache结果如何失效等策略都是和具体业务逻辑紧密相关的,Searcher Cache允许用户在配置和查询串中对不同的策略进行开关设定,结合ha3的插件机制可以灵活的定制各种用户对cache的业务需求。

子句语法

'searcher_cache='searcher_cache_clause
searcher_cache_clause := ['use:'cache_use_flag]                              (1)
[',key:'hash_sign]                                                           (2)
[',expire_time:'expire_time_expr]                                            (3)
[',cur_time:'current_time]                                                   (4)
[',cache_filter:'filter_expr]                                                (5)
[',cache_doc_num_limit:'cache_doc_num_limit_config]                          (6)
[',refresh_attributes:'refresh_attributes_config]                            (7)
cache_use_flag := 'yes' | 'no'
hash_sign := NUMBER
expire_time_expr := va_expression
current_time := NUMBER
filter_expr := va_expression
cache_doc_num_limit_config := cache_doc_num; cache_doc_num
cache_doc_num := NUMBER
refresh_attributes_config := attribute_name;attribute_name
flag := 'yes' | 'no'

参数说明:

  • use:指定是否进Searcher Cache的开关,其值可以为:yes 或者 no,其他值在解析时会视为错误。

  • 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结果的过期时间。

  • cur_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总是使用最新值,从而保证时效性

示例:

searcher_cache=use:yes,key:xxx,expire_time:func(end_time, 15, 10),cur_time:123456,cache_filter:expr,cache_doc_num_limit:280;780,refresh_attributes:price;count

注意事项:

  • searcher_cache是可选子句。

  • 当前采用的Cache 文档个数策略与searcher上required topK相关。这个required_topK与request中的start + hit值相关。当存在多个searcher时,QRS会对每个searcher返回的文档个数做限制,主要通过searcher_return_hits来限制。所以searcher上的required_topK值为:min(start+hit, searcher_return_hits)。

  • Searcher Cache缓存的是精排后的结果,为了保证有足够的结果进cache,必须使得有相应数目的结果能在精排后被留下来,可以在rerank scorer中指定rank_size或者request中的config子句指定rerank_size。