fq(Filter Query)参数
fq 参数定义了一个查询,可以用来限制可以返回的文档的超集,而不影响 score。这对于加快复杂查询非常有用,因为指定的查询 fq 是独立于主查询而被缓存的。当以后的查询使用相同的过滤器时,会有一个缓存命中,过滤器结果从缓存中快速返回。
使用该 fq 参数时,请记住以下几点:
- 该 fq 参数可以在查询中多次指定
- filter 查询可能涉及复杂的 Boolean 查询
- 每个过滤器查询的文档集都是独立缓存的
- 还可以在 fq 内部使用 filter(condition) 语法来单独缓存子句, 以及在其他情况下,实现缓存的筛选器查询的联合
- 与所有参数一样: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