solr4.7.2自定义后置过滤器PostFilter

fq(Filter Query)参数

fq 参数定义了一个查询,可以用来限制可以返回的文档的超集,而不影响 score。这对于加快复杂查询非常有用,因为指定的查询 fq 是独立于主查询而被缓存的。当以后的查询使用相同的过滤器时,会有一个缓存命中,过滤器结果从缓存中快速返回。

使用该 fq 参数时,请记住以下几点:

  1. 该 fq 参数可以在查询中多次指定
  2. filter 查询可能涉及复杂的 Boolean 查询
  3. 每个过滤器查询的文档集都是独立缓存的
  4. 还可以在 fq 内部使用 filter(condition) 语法来单独缓存子句, 以及在其他情况下,实现缓存的筛选器查询的联合
  5. 与所有参数一样:URL 中的特殊字符需要正确转义并编码为十六进制值

cache 参数

Solr 默认缓存所有查询的结果并过滤查询。
要禁用结果缓存,请设置 cache=false 参数。
可以使用 成本(cost)选项来控制计算非缓存筛选器查询的顺序。这使您可以在昂贵成本的非缓存过滤器之前订购更便宜成本的非缓存过滤器。
对于成本非常高的过滤器,如果 cache=false 并且 cost>=100 和查询实现了 PostFilter 接口,则将从该查询请求收集器,并在匹配主查询和所有其他过滤器查询后用于过滤文档。
可以有多个后置过滤器;他们也按成本cost排序。

SolrIndexSearcher

SolrIndexSearcher类中getProcessedFilter方法定义了PostFilter的使用逻辑

public ProcessedFilter getProcessedFilter(DocSet setFilter, List<Query> queries) throws IOException {
    ProcessedFilter pf = new ProcessedFilter();
    if (queries==null || queries.size()==0) {
      if (setFilter != null)
        pf.filter = setFilter.getTopFilter();
      return pf;
    }

    ........省略部分代码..........
    
    for (Query q : queries) {
      if (q instanceof ExtendedQuery) {
        ExtendedQuery eq = (ExtendedQuery)q;
        if (!eq.getCache()) {
          if (eq.getCost() >= 100 && eq instanceof PostFilter) {
            if (postFilters == null) postFilters = new ArrayList<Query>(sets.length-end);
            postFilters.add(q);
          } else {
            if (notCached == null) notCached = new ArrayList<Query>(sets.length-end);
            not
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值