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开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...
此外,Lucene 1.4.3还提供了丰富的API供开发者使用,例如,IndexWriter用于创建和更新索引,IndexReader用于读取索引,Searcher用于执行查询。这些API的设计使得开发者能够灵活地构建自己的搜索引擎应用。 通过阅读...
综合Lucene和Heritrix,可以构建一个典型的垂直搜索系统。垂直搜索引擎专注于特定领域的内容,例如电商、新闻、学术论文等,它比通用搜索引擎更能深入地提供与特定主题相关的搜索结果。开发一个垂直搜索引擎的过程...
总的来说,这个例子是一个综合性的Web应用,它展示了如何利用Lucene进行全文搜索,结合Ajax技术实现动态更新的搜索结果展示,同时还包括了高亮显示和多次搜索的功能。这对于学习和理解Lucene在实际应用中的工作原理...
总的来说,掌握Lucene、Compass和Ajax的综合运用,将使开发者能够在Web应用中构建出强大且用户友好的搜索功能,提升整体项目的竞争力。在学习过程中,不断实践、不断优化,才能真正将这些技术运用自如。
总的来说,基于Lucene的问答系统构建是一个涉及数据库设计、文本处理、搜索算法、前端交互等多个领域的综合性工程。通过合理地运用这些技术,我们可以搭建出一个能够高效检索和呈现信息的问答平台,满足用户快速获取...
描述中的“NULL”意味着没有具体的细节,但我们可以从标签“源码”和“工具”推断,这个压缩包可能包含了使用Lucene构建的搜索工具的源代码,或者是关于如何使用Lucene的示例代码。 标签“源码”表明文件内可能有...
总的来说,Lucene.Net 在 .Net MVC4 上实现全文检索是一个涉及数据库交互、索引构建、查询处理和结果展示的综合过程。通过熟练掌握 Lucene.Net 的使用,可以为用户提供高效、准确的全文搜索体验。
总的来说,选择和使用合适的Lucene中文分词器组件是实现高效、准确的中文搜索的关键。开发者需要根据项目需求、资源限制以及对分词效果的要求,综合评估后选择最适合的分词工具。同时,持续关注分词器的更新和改进,...
综上所述,基于Lucene技术开发的桌面搜索软件不仅具有较高的实用价值,还能反映出开发者在Java编程、搜索引擎原理等方面的综合能力。对于有兴趣从事软件开发领域工作的同学而言,该项目是一个非常好的实践机会,能够...
本文将围绕“Lucene 7例子”这一主题,通过一个实际的测试案例,深入解析Lucene 7的核心特性和使用方法。 首先,我们要明确Lucene是什么。Lucene是Java编写的一个高性能、可扩展的信息检索库,它提供了一个简单的...
总结,基于Lucene 4.8的空间检索是一个综合了地理信息处理和全文检索技术的高级应用,它使得我们可以根据地理位置快速查找相关数据。在实际操作中,需要对CSV数据进行预处理,建立空间索引,并通过适当的空间查询API...
【标题】"java+lucene)1236.rar_Lucene 搜索_Luncene_lucene_lucene web" 提供的信息表明这是一个使用Java和Lucene框架实现的搜索系统,特别是针对公交数据的搜索。Lucene是Apache软件基金会的一个开源全文检索库,...
在项目中,你可能有一个名为`Indexer`的类,它负责读取数据源(例如,从文件、数据库或其他来源),使用Analyzer处理文本,并将处理后的数据写入到Lucene索引中。索引可以存储在文件系统或者内存中,取决于项目的...
6. 标准分析器(StandardAnalyzer):这是Lucene提供的一个常用分析器,它综合了StandardTokenizer、StandardFilter、LowerCaseFilter和StopFilter,适合处理大多数英文文本。 7. 跨语言分析器(ICUAnalyzer):...
在本项目中,“Java Web+爬虫+lucene 大学新闻网”是一个综合性的技术实践,主要涉及了三个关键领域:Java Web开发、网络爬虫技术和Lucene搜索引擎库。以下将详细解析这些知识点。 首先,Java Web是使用Java语言...
在Java环境中,Apache Lucene是一个广泛使用的全文搜索引擎库,它提供了丰富的文本处理工具,包括分词功能。 标题提到的"MMAnalyzer 分词jar包"是基于Lucene的一个中文分词组件,名为Jeasy Analysis,具体版本为...
为了提供精确的搜索结果,Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)算法计算文档的相关性得分。TF-IDF综合考虑了词条在文档中的频率(Term Frequency)以及在整个文档集合中的稀有程度...