@tsihedeyo
2014-08-09T21:13:02.000000Z
字数 1353
阅读 2634
solr_in_action
chapter_7
翻译
7.3 Queries and filters
Solr中的查询包含两个主要操作:寻找匹配的文档,文档排序。缺省下文档按照相关度排序。Solr的反向索引寻找过程以及相关度score算法都在第3章中。
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步过程
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