[关闭]
@tsihedeyo 2014-08-09T21:13:02.000000Z 字数 1353 阅读 2634

Solr in Action 7.3

solr_in_action chapter_7 翻译


7.3 Queries and filters

Solr中的查询包含两个主要操作:寻找匹配的文档,文档排序。缺省下文档按照相关度排序。Solr的反向索引寻找过程以及相关度score算法都在第3章中。


7.3.1 fq q

fq: filter query
q: query

相关度影响

这两个参数有什么区别,fq只有一个目的:限制返回结果,q的用处:

  • 限制结果返回
  • 为相关度计算提供数据

也就是说说q才牵扯进了相关度计算中,q更倾向于放user-entered的关键字(比如keywords:"apache solr"),fq则放置machine-generated字段(如category:"technology")

Caching and execution speed

fq从q中分离出来的意义:

1.fq字段可能被重用,filter cache中可保存过滤掉的结果
2.fq减少相关度计算量

Specifying multiple queries and filters

还有一个要注意的点就是fq可以有多个值,但q只能有一个值

Order of execution

顺序其实不定,通常按照以下执行:

1.在filter cache中查询fq参数。若该fq参数存在,则返回一个DocSet,包含一个bit位(0,1)指示该文档是否包含该filter参数。
2.若filter cache中查不到该字段,则新建DocSet,并存入cache中
3.All filter DocSet are intersected to yield a single DocSet
4.处理q参数,filter匹配和q匹配的文档ID都被选择
5.query中包含post filters,作为collection 过程进一步处理

图7.3描述了这5步过程


7.3.2 Handling expensive filters

Solr支持配置对哪些filter进行缓存

关闭filter缓存

显示申明:

fq={!cache=false}id:123&fq={!frange l=90 u=100 cache=false}
scale(query({!v="content:(solr OR lucene)"}),0,100)

示例filter中,第一个为某个id的过滤,不适合缓存。

更改filter执行顺序

设计到一些需要进行复杂filter的时候,可能需要设置下filter执行顺序。可通过设定cost完成。
fq={!cost=1}category:technology&
fq={!cost=2}date:[NOW/DAY-1YEAR TO *]&
fq={!geofilt pt=37.773,-122.419 sfield=location d=50 cost=3}&
fq={!frange l=90 u=100 cache=false cost=100}
scale(query({!v="content:(solr OR lucene)"}),0,100)

cost值越高,则会被越晚执行。

Post filtering
有些filter执行过重,使得你希望最后去执行,则这个就用到post filter

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注