I.Sorting search results
在Lucene中有两种特别的类型是用来排序的:Score和Index order
要排序结果 可以使用IndexSearcher的重载serach函数,提供一个Sort参数.看个例子.SortingExample.java
01
package
lia.advsearching;
02
03
import
org.apache.commons.lang.StringUtils;
04
import
org.apache.lucene.document.Document;
05
import
org.apache.lucene.index.Term;
06
import
org.apache.lucene.search.Hits;
07
import
org.apache.lucene.search.IndexSearcher;
08
import
org.apache.lucene.search.Query;
09
import
org.apache.lucene.search.RangeQuery;
10
import
org.apache.lucene.search.Sort;
11
import
org.apache.lucene.search.SortField;
12
import
org.apache.lucene.store.Directory;
13
import
org.apache.lucene.store.FSDirectory;
14
15
import
java.io.IOException;
16
import
java.text.DecimalFormat;
17
18
public class
SortingExample {
19
private
Directory directory;
20
21
public
SortingExample(Directory directory) {
22
this
.directory = directory;
23
}
24
//
显示搜索结果
25
public void
displayHits(Query query, Sort sort)
26
throws
IOException {
27
IndexSearcher searcher =
new
IndexSearcher(directory);
28
29
Hits hits = searcher.search(query, sort); //
安
sort
来排序搜索结果
30
31
System.out.println(
"\nResults for: "
+
32
query.toString() +
" sorted by "
+ sort); //
打印
query
和
sort
33
34
System.out.println(StringUtils.rightPad(
"Title"
,
30
) + //
使用
StringUtils(
来自
Apache commons)
打印结果
35
StringUtils.rightPad(
"pubmonth"
,
10
) +
36
StringUtils.center(
"id"
,
4
) +
37
StringUtils.center(
"score"
,
15
));
38
39
DecimalFormat scoreFormatter =
new
DecimalFormat(
"0.######"
);
40
for
(
int
i =
0
; i < hits.length(); i++) { //
打印结果
41
Document doc = hits.doc(i);
42
System.out.println(
43
StringUtils.rightPad(
44
StringUtils.abbreviate(doc.get(
"title"
),
29
),
30
) +
45
StringUtils.rightPad(doc.get(
"pubmonth"
),
10
) +
46
StringUtils.center(
""
+ hits.id(i),
4
) +
47
StringUtils.leftPad(
48
scoreFormatter.format(hits.score(i)),
12
));
49
System.out.println(
" "
+ doc.get(
"category"
));
50
// System.out.println(searcher.explain(query, hits.id(i)));
51
}
52
53
searcher.close();
54
}
55
56
public static void
main(String[] args)
throws
Exception {
57
Term earliest =
new
Term(
"pubmonth"
,
"190001"
);
58
Term latest =
new
Term(
"pubmonth"
,
"201012"
);
59
RangeQuery allBooks =
new
RangeQuery(earliest, latest,
true
); // query
60
61
String indexDir = System.getProperty(
"index.dir"
); // index
的目录
62
63
FSDirectory directory =
64
FSDirectory.getDirectory(indexDir,
false
);
65
SortingExample example =
new
SortingExample(directory);
66
67
example.displayHits(allBooks, Sort.RELEVANCE); //
使用
Lucene
默认的排序
68
69
example.displayHits(allBooks, Sort.INDEXORDER); //
根据
IndexOrder
排序
70
71
example.displayHits(allBooks,
new
Sort(
"category"
)); //
根据
category
排序
72
73
example.displayHits(allBooks,
new
Sort(
"pubmonth"
,
true
)); //
根据
pubmonth
排序
74
75
example.displayHits(allBooks,
76
new
Sort(
new
SortField[]{
77
new
SortField(
"category"
),
78
SortField.FIELD_SCORE,
79
new
SortField(
"pubmonth"
, SortField.INT,
true
)
80
})); ///
81
82
83
example.displayHits(allBooks,
new
Sort(
new
SortField[] {SortField.FIELD_SCORE,
new
SortField(
"category"
)}));
84
}
85
}
当sort 参数是null ,new Sort(),和Sort.RELEVANCE 时,使用的是Lucene的默认排序(按照Relevance的递减排序), 默认搜索的结果如下:
先按照Score递减排序 如果Score相同则按照Docnum 递增排序.
If the order documents were indexed is relevant, you can use Sort.INDEXORDER.
下面是其输出结果:(安装ID来排序)
要利用Field排序,该field要满足第二章排序(参考我的Blog上的内容)的要求. 下面是使用category field的输出.
默认的field排序是按照自然排序,利用Sort的重载函数,提供一个reverse参数可以改变顺序.结果如下:
example.displayHits(allBooks, new Sort("pubmonth", true)); 提供了true参数.
还可以根据多个Field排序. 用法如下:
example.displayHits(allBooks,
new Sort(new SortField[]{
new SortField("category"),
SortField.FIELD_SCORE,
new SortField("pubmonth", SortField.INT, true)
}));
margin: 5pt 6
分享到:
相关推荐
全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎
综合各项技术构建了一个典型的垂直搜索系统,具有很强的商业使用价值。
利用开源框架Lucene实现汉字分隔,拼音检索,纠错提示的公共的一个综合demo
解密搜索引擎技术实战 LUCENE 高清完整PDF带书签,仅供学习参考! 综合评分:5
该书是一本针对搜索引擎开发的书籍。通过学习本书,读者可以独立构建出一个企业级的搜索引擎网站。该书详细讲解了搜索引擎...最后综合使用所讲述的技术,构建了一个典型的垂直搜索系统,该系统具有很强的商业实用价值。
通用数据访问层及Ajax服务端框架的综合示例
某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此 外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用 Solr 创建的索引 Solr 的特性包括: 高级的全文搜索功能 专为高通量...
Solr是一个拥有象WebService一样接口的独立运行的搜索服务器。它是基于lucene搜索引擎的服务,你将能够通过HTTP协议以XML格式将文档放入搜索服务器(这个过程叫做索引...使用XML配置达到灵活性和适配性 可扩展的插件体系
针对有色冶金信息化服务平台文献资源检索功能的开发,综合运用Lucene.net、盘古分词等系列开源工具包,并结合中文分析器,对存储于数据库中的文档信息建立索引;根据用户提交的关键字信息,实现文献资源高效检索的功能....
struts等开放源代码综合应用示例代码 关于《java开放源码编程》此书介绍了如何通过使用开放源码工具来构建一个现实的应用,以提高开发效率,降低企业开发费用。 本书共分三个部分,使基本概念、使用工具和开发应用...
企业搜索引擎方案选型 由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前...基于以述的几种方案的综合分析,对于我们公司的搜索引擎方案,采用solr来实现比较合适。
SpaceBuilder最新版本采用asp.net mvc开发,是迄今为止基于asp.net技术的最强大的社区产品,采用了世界领先的技术体系架构、优异的缓存技术、基于Lucene的全文检索技术,可以承载千万级的数据,并提供良好的安全性及...
小旋风是一款集多任务、多线程智能网络爬虫、基于xml / xpath的路径规则的数据抽取系统、无缝集成lucene.net2.3全文索引系统,高性能中文分词组件、多数据库支持的综合垂直搜索引擎平台。 它帮您快速搭建任何一个您...
如使用表情、识别微信浏览器、图文消息使用、公众账号无响应处理、服务多个账号等,然后逐步详细地讲解了“周边搜索”、“猜数字”(游戏)和“聊天机器人”3个综合案例的开发过程。 作者简介 刘运强,网名“柳峰...
包含 开发自己的搜索引擎 lucene heritrix全部源码,包括前面的实验例子和后面的综合例子
系统采用Spring + hibernate ,整合shiro 权限,lucene,activiti,多个技术的金融综合系统 前后端完整,eclipse开发 ,网站17年运营后关闭 ,该部分代码于项目上线中期开发段代码 ,推荐学习使用
ElasticSearch-Sql + Mybatis + Druid + SpringBoot实现ES的综合操作 1.安装ElasticSearch6.5.1 解压相关的ElasticSearch6.5.1的tar包到目录下,如果我们需要使用JDBC来连接的话是需要到白金版以上的,分享出本人将...
项目简介:淘淘网上商城是一个综合性的B2C平台,类似京东商城、天猫商城。会员可以在商城浏览商品、下订单,以及参加各种活动。商家可以在入住淘 淘商城,在该平台上开店出售自己的商品,并且得到淘淘商城提供的可靠...
│ 05.svn的使用.avi │ 06.ssm框架整合思路.avi │ 07.ssm框架整合.avi │ 08.测试工程.avi │ 打开必读.txt │ 淘淘商城第一天笔记.docx │ ├─02.第二天 │ 07.商品类目选择完成.avi │ 01.课程计划.avi │ 02....
Solr它是一种开放源码的、基于 Lucene 的搜索服务器,可以高效的完成全文检索的功能。在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一...