`

lucene综合使用

阅读更多

I.Sorting search results

Lucene中有两种特别的类型是用来排序的:ScoreIndex 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开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...

    lucene1.4.3.jar

    此外,Lucene 1.4.3还提供了丰富的API供开发者使用,例如,IndexWriter用于创建和更新索引,IndexReader用于读取索引,Searcher用于执行查询。这些API的设计使得开发者能够灵活地构建自己的搜索引擎应用。 通过阅读...

    开发自己的搜索引擎 lucene + heritrix

    综合Lucene和Heritrix,可以构建一个典型的垂直搜索系统。垂直搜索引擎专注于特定领域的内容,例如电商、新闻、学术论文等,它比通用搜索引擎更能深入地提供与特定主题相关的搜索结果。开发一个垂直搜索引擎的过程...

    lucene全文搜索ajax例子

    总的来说,这个例子是一个综合性的Web应用,它展示了如何利用Lucene进行全文搜索,结合Ajax技术实现动态更新的搜索结果展示,同时还包括了高亮显示和多次搜索的功能。这对于学习和理解Lucene在实际应用中的工作原理...

    Lucene+compass学习资料

    总的来说,掌握Lucene、Compass和Ajax的综合运用,将使开发者能够在Web应用中构建出强大且用户友好的搜索功能,提升整体项目的竞争力。在学习过程中,不断实践、不断优化,才能真正将这些技术运用自如。

    基于lucene的问答系统

    总的来说,基于Lucene的问答系统构建是一个涉及数据库设计、文本处理、搜索算法、前端交互等多个领域的综合性工程。通过合理地运用这些技术,我们可以搭建出一个能够高效检索和呈现信息的问答平台,满足用户快速获取...

    我封装的搜索引擎之lucene篇

    描述中的“NULL”意味着没有具体的细节,但我们可以从标签“源码”和“工具”推断,这个压缩包可能包含了使用Lucene构建的搜索工具的源代码,或者是关于如何使用Lucene的示例代码。 标签“源码”表明文件内可能有...

    Lucene.Net 实现全文检索

    总的来说,Lucene.Net 在 .Net MVC4 上实现全文检索是一个涉及数据库交互、索引构建、查询处理和结果展示的综合过程。通过熟练掌握 Lucene.Net 的使用,可以为用户提供高效、准确的全文搜索体验。

    Lucene中文分词器组件

    总的来说,选择和使用合适的Lucene中文分词器组件是实现高效、准确的中文搜索的关键。开发者需要根据项目需求、资源限制以及对分词效果的要求,综合评估后选择最适合的分词工具。同时,持续关注分词器的更新和改进,...

    基于Lucene的桌面搜索软件

    综上所述,基于Lucene技术开发的桌面搜索软件不仅具有较高的实用价值,还能反映出开发者在Java编程、搜索引擎原理等方面的综合能力。对于有兴趣从事软件开发领域工作的同学而言,该项目是一个非常好的实践机会,能够...

    lucene7例子

    本文将围绕“Lucene 7例子”这一主题,通过一个实际的测试案例,深入解析Lucene 7的核心特性和使用方法。 首先,我们要明确Lucene是什么。Lucene是Java编写的一个高性能、可扩展的信息检索库,它提供了一个简单的...

    基于Lucene4.8的空间检索

    总结,基于Lucene 4.8的空间检索是一个综合了地理信息处理和全文检索技术的高级应用,它使得我们可以根据地理位置快速查找相关数据。在实际操作中,需要对CSV数据进行预处理,建立空间索引,并通过适当的空间查询API...

    java+lucene)1236.rar_Lucene 搜索_Luncene_lucene_lucene web

    【标题】"java+lucene)1236.rar_Lucene 搜索_Luncene_lucene_lucene web" 提供的信息表明这是一个使用Java和Lucene框架实现的搜索系统,特别是针对公交数据的搜索。Lucene是Apache软件基金会的一个开源全文检索库,...

    一个基于LUCENE搜索引擎项目例子

    在项目中,你可能有一个名为`Indexer`的类,它负责读取数据源(例如,从文件、数据库或其他来源),使用Analyzer处理文本,并将处理后的数据写入到Lucene索引中。索引可以存储在文件系统或者内存中,取决于项目的...

    apache-lucene-analyzers.jar

    6. 标准分析器(StandardAnalyzer):这是Lucene提供的一个常用分析器,它综合了StandardTokenizer、StandardFilter、LowerCaseFilter和StopFilter,适合处理大多数英文文本。 7. 跨语言分析器(ICUAnalyzer):...

    Java Web+爬虫+lucene 大学新闻网

    在本项目中,“Java Web+爬虫+lucene 大学新闻网”是一个综合性的技术实践,主要涉及了三个关键领域:Java Web开发、网络爬虫技术和Lucene搜索引擎库。以下将详细解析这些知识点。 首先,Java Web是使用Java语言...

    MMAnalyzer 分词jar包(lucene-core-2.4.1.jar je-analysis-1.5.3.jar)

    在Java环境中,Apache Lucene是一个广泛使用的全文搜索引擎库,它提供了丰富的文本处理工具,包括分词功能。 标题提到的"MMAnalyzer 分词jar包"是基于Lucene的一个中文分词组件,名为Jeasy Analysis,具体版本为...

    luceneInAction2nd源码

    为了提供精确的搜索结果,Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)算法计算文档的相关性得分。TF-IDF综合考虑了词条在文档中的频率(Term Frequency)以及在整个文档集合中的稀有程度...

Global site tag (gtag.js) - Google Analytics