Lucene的多域查询、结果中查询、查询结果分页、高亮查询结果和结果评分
使用lucene构造搜索引擎的时候,如果要针对多个域进行一次性查询,一般来说有三种方法:
第一种实现方法是创建多值的全包含域的文本进行索引,这个方案最简单。但是这个防范有个缺点:你不能直接对每个域的加权进行控制。
第二种方法是使用MultiFieldQueryParser,它是QueryParser的子类,它会在后台程序中实例化一个QueryParser对象,用来针对每个域进行查询表达式的解析,然后使用BooleanQuery将查询结果合并起来。当程序向BooleanQuery添加查询子句时,默认操作符OR被用于最简单的解析方法中。为了实现更好的控制,布尔操作符可以使用BooleanClause的常量指定给每个域。,,。下面的程序展示的是如何创建MultiFieldQueryParser类的方法:
[java] view plaincopy
// 在这四个域中检索
String[] fields = { "ype", "name", "category", "price" };
Query query = new MultiFieldQueryParser(, fields, analyzer).parse(keyword);
第三种方法就是使用高级DisjunctionMaxQuery类,它会封装一个或者多个任意的查询,将匹配的文档进行OR操作。
以上三种方案中,并不是第三种方案最好,也不是第一种方案就最差。哪种实现方式更适合你的应用程序呢?答案是“看情况”,因为这里存在一些取舍。全包含域是一个简单的解决方案——但这个方案只能对搜索结果进行简单的排序并且可能浪费磁盘空间(程序可能对同样的文本索引两次),但这个方案可能会获得最好的搜索性能。
MultiFieldQueryParser生成的BooleanQuery会计算所有查询所匹配的文档评分的总和(DisjunctionMaxQuery则只选取最大评分),然后它能够实现针对每个域的加权。你必须对以上3中解决方案都进行测试,同时需要一起考虑搜索性能和搜索相关性,然后再找出最佳方案。
在检索结果中再次进行检索,是一个很常见的需求,一般有两种方案可以选择:
①使用QueryFilter把第一个查询当作一个过滤器处理;
②用BooleanQuery把前后两个查询结合起来,。
针对第一种方法,我需要解释一下。,,lucene的API中这个类已经被废弃了,无法再找到。,但是你又一定要使用QueryF
Lucene的多域查询结果中查询查询结果分页高亮查询结果和结果评分 来自淘豆网m.daumloan.com转载请标明出处.