[lucene] 请教查询时如何限定某些条件?
luckaway
2010-01-19
不完全正确,并不是遍历结果集,而是遍历所有的文档(不是一定所有的文档,可能lucene会做了一些跳跃),找到你符合你Filter文档ID,然后再跟其他的其他条件的文档ID进行交集。
比方说:符合Fiter的条件有文档ID有:1,6,8,9 符合其他条件的文档ID有:5,6,7,9 那最终的返回结果就是:6,9 |
|
TonyLian
2010-01-19
luckaway 写道 不完全正确,并不是遍历结果集,而是遍历所有的文档(不是一定所有的文档,可能lucene会做了一些跳跃),找到你符合你Filter文档ID,然后再跟其他的其他条件的文档ID进行交集。
比方说:符合Fiter的条件有文档ID有:1,6,8,9 符合其他条件的文档ID有:5,6,7,9 那最终的返回结果就是:6,9 哦,相当于类似2次查询,然后取交集? 如果是这样的话,那想必速度是差的。 |
|
TonyLian
2010-01-21
请教 luckaway:
我想了一下,对比2楼和5楼的代码,都是“构建”一个query,然后这样search: TopDocs topDocs = isearcher.search(query, count); 用的都是 search(Query query, int n) 而不是用 search(Query query, Filter filter, int n) 所以,2楼的方法的性能真的不如5楼吗? 真的是先查询,再筛选吗? 我的数据量太小,看不出耗时的差别。 |
|
luckaway
2010-01-21
数据量越多,而且该字段值的枚举越少,则差别越明显!
数据量越多,当字段值的枚举非常多的时候,效率反而是Filter高。 因为你的type枚举只有几个:sport、new。。 不过你数据量少,都无所谓了! 随你喜欢吧! |
|
TonyLian
2010-01-21
还有一点就是,5楼的方法,由于 Type限定 也成了 query 的一部分,所以在查询的时候,Type的关键字,如“PDF",如果也出现在正文中,则这样的文件会提高相似度,就连高亮也会把"PDF"高亮出来的。
![]() |
|
TonyLian
2010-02-01
今天又看到一个使用
MultiFieldQueryParser.parse()方法,结合 BooleanClause.Occur[]参数的方法。 感觉和5楼的似乎原来差不多,请高手来解释一下3种方法的区别吧。 |