package com.nanjing.chaoxing.lucene;
import com.nanjing.chaoxing.lucene.model.Book;
import com.nanjing.chaoxing.lucene.model.BookUtil;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.search.highlight.*;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SortAndFilterAndHighligher {
private Logger logger = Logger.getLogger(SortAndFilterAndHighligher.class);
@BeforeClass
public static void init() throws IOException {
BookUtil bookUtil = new BookUtil();
bookUtil.createIndexWriter();
bookUtil.createDocument();
}
/**
* 排序并过滤
* @throws IOException
* @throws ParseException
*/
@Test
public void sort() throws IOException, ParseException {
IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
Query query = new QueryParser(Version.LUCENE_36, "bookid", new StandardAnalyzer(Version.LUCENE_36)).parse("6270000~");
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//数字过滤器
NumericRangeFilter numericRangeFilter = NumericRangeFilter.newIntRange("year", 2010, 2012, true, true);
//排序
SortField sortField = new SortField("bookid", SortField.STRING);
logger.info("sort" + " begin....");
TopDocs topDocs = indexSearcher.search(query, numericRangeFilter, 1000, new Sort(sortField));
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
int doc = scoreDoc.doc;
for (Book book : BookUtil.bookList) {
if (indexSearcher.doc(doc).get("bookid").equals(book.getBookid())) {
logger.info(book.toString());
}
}
}
logger.info("sort" + " end....\n");
}
/**
* 高亮显示
*
* @throws ParseException
* @throws IOException
*/
// @Test
public void highligher() throws ParseException, IOException, InvalidTokenOffsetsException {
List<Book> books = new ArrayList<Book>();
IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
Query query = new QueryParser(Version.LUCENE_36, "author", new StandardAnalyzer(Version.LUCENE_36)).parse("jam~");
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(100);
highlighter.setTextFragmenter(fragmenter);
TopDocs topDocs = indexSearcher.search(query, 1000);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
System.out.println("高亮显示:");
for (int i = 0; i < scoreDocs.length; i++) {
int docid = scoreDocs[i].doc;
float score = scoreDocs[i].score;//当前结果的相关度得分
System.out.println("score is : " + score);
Document doc = indexSearcher.doc(docid);
String author = doc.get("author");
String highterBooid = highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_36), "author", author);
for (Book book : BookUtil.bookList) {
if (book.getBookid().equals(doc.get("bookid"))) {
book.setAuthor(highterBooid);
System.out.println(book.toString());
}
}
}
}
}
分享到:
相关推荐
本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...
例如,我们可以先使用Filter筛选出满足条件的文档,再根据某个字段进行排序,最后对高亮显示匹配的关键词。 值得注意的是,尽管Filter可以显著提高性能,但过度使用或设计不当可能会导致内存消耗增加,因此在使用...
本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...
使用高亮器,我们可以突出显示搜索查询中的关键字,使其在文档内容中更加醒目。通常,这涉及到将原始文本分词,找到匹配的搜索词,然后用特定的格式(如不同的颜色或样式)替换这些关键词。在Lucene.Net 2.9.1中,这...
此外,还可能涉及到评分策略、排序和高亮显示等高级特性,这些都是提升用户体验的重要部分。 总之,"Lucene测试程序3.5"为我们提供了一个深入理解Lucene如何处理全文搜索问题的实例。通过创建索引、使用标准分词器...
5. **内存缓存与过滤器**:Lucene提供`Filter`类来处理如文档过滤、高亮显示等功能。同时,`BitSet`类用于在内存中高效地存储和操作文档集。 6. **倒排索引的优化**:在`MergePolicy`和`MergeScheduler`中,你可以...
5. **过滤与高亮**:Lucene还支持对搜索结果进行过滤(如按时间、类别筛选),以及对匹配的查询词在文档中进行高亮显示。 6. **更新与删除**:索引不是静态的,可以添加、更新和删除文档,以反映源数据的变化。 7....
源码文件通常包含了书中各个章节的示例程序,这些示例涵盖了Lucene的基本用法到高级特性的实现,如文档索引、搜索查询、结果排序、过滤器、分词器、高亮显示等。通过研究这些源码,开发者可以了解如何有效地利用...
Lucene最初由Doug Cutting创建,它是一个高性能、全文本搜索的Java库,为开发者提供了构建搜索引擎所需的各种组件,如索引、查询解析、排序和高亮显示等。Lucene 2.9.4是其历史上的一个重要版本,具有稳定性和兼容...
7. **高亮显示**:介绍如何在搜索结果中高亮显示匹配的关键词,提升用户体验。 8. **排序与过滤**:讨论如何根据不同的标准(如相关性、时间戳等)对搜索结果进行排序,以及如何实现过滤器来限制搜索范围。 9. **...
同时,`Highlighter`类用于对搜索结果中的匹配片段进行高亮显示,提升用户体验。 6. **多字段搜索**:在3.0.3版本中,你可以学习如何对多个字段进行联合搜索,以及如何设置字段的权重来影响搜索结果。 7. **更新与...
此外,Lucene还支持高亮显示搜索结果中的关键词,使用户更容易识别相关性高的部分。 【总结】 Lucene是一个强大的全文搜索引擎库,它简化了从数据提取、索引创建到查询执行的整个过程。通过理解并熟练运用Document...
LuceneinAction作为Lucene最权威的指南,提供了搜索、排序、过滤以及高亮显示搜索结果的详细说明。该书不仅提供了源码示例的实用性和可重用性,还着重介绍了如何将搜索功能集成到自己的应用程序中。Lucene的实例应用...
3. **高亮显示**:Lucene能够对搜索结果中的匹配关键词进行高亮,提升用户体验。 4. **排序与评分**:除了返回匹配的文档,Lucene还能根据相关性对结果进行排序,使用TF-IDF等算法计算每个文档的得分。 5. **多...
9. **lucene-highlighter-4.6.0.jar**:高亮显示库,用于在搜索结果中突出显示匹配的关键词,使用户更容易找到相关部分。 10. **lucene-analyzers-icu-5.3.0.jar**:基于Unicode的International Components for ...
- 多个域的高亮显示。 #### 6.4 近实时搜索 - 实现近实时搜索机制,提供更快的搜索响应。 - 创建和使用近实时索引。 以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和...
Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会指导如何配置和使用Highlighter,以优雅地展示搜索结果。 5. **多字段与多语言支持**: Lucene 支持在一个...
3. **lucene-highlighter-3.6.2.jar**:高亮显示是Lucene3.6.2中的一项重要特性,这个库提供了高亮搜索结果的功能。当用户进行搜索时,系统可以自动识别出查询中的相关片段,并在展示结果时对其进行突出显示,提高...
3. **Lucene Highlighter 3.4.0**: `lucene-highlighter-3.4.0.jar`是高亮显示模块,用于在搜索结果中突出显示与查询匹配的部分。在实际应用中,用户通常希望看到搜索关键词在文档中的确切位置,高亮显示能够帮助...
实际开发中,你可能需要处理更复杂的需求,如多字段搜索、排序、高亮显示等。Lucene提供了一系列高级功能,如`BooleanQuery`、`PhraseQuery`、`WildcardQuery`等,可以根据需求灵活使用。 通过学习和实践这个Lucene...