Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter
这里的三个示例都是使用Highlighter;
示例代码:
package com.tan.code;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class HighlighterTest {
// 高亮處理文本(以下内容纯属虚构)
private String text = "China has lots of people,most of them are very poor.China is very big.China become strong now,but the poor people is also poor than other controry";
// 原文高亮
public void highlighter() throws IOException, InvalidTokenOffsetsException {
TermQuery termQuery = new TermQuery(new Term("field", "china"));
TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
.tokenStream("field", new StringReader(text));
QueryScorer queryScorer = new QueryScorer(termQuery);
Highlighter highlighter = new Highlighter(queryScorer);
highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
System.out.println(highlighter.getBestFragment(tokenStream, text));
}
// 使用CSS進行高亮顯示處理
public void highlighter_CSS(String searchText) throws ParseException,
IOException, InvalidTokenOffsetsException {
// 創建查詢
QueryParser queryParser = new QueryParser(Version.LUCENE_43, "field",
new SimpleAnalyzer(Version.LUCENE_43));
Query query = queryParser.parse(searchText);
// 自定义标注高亮文本标签
SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter(
"<span style=\"backgroud:red\">", "</span>");
// 语汇单元化
TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
.tokenStream("field", new StringReader(text));
// 創建QueryScoer
QueryScorer queryScorer = new QueryScorer(query, "field");
Highlighter highlighter = new Highlighter(htmlFormatter, queryScorer);
highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
System.out.println(highlighter.getBestFragments(tokenStream, text, 4,
"..."));
}
// 高亮顯示搜索結果
public void highlighter_SR(String field, String searchText)
throws IOException, ParseException, InvalidTokenOffsetsException {
//本次示例为了简便直接使用之前实验建立的索引
Directory directory = new SimpleFSDirectory(new File("E://MyIndex"));
IndexReader reader = DirectoryReader.open(directory);// 读取目录
IndexSearcher search = new IndexSearcher(reader);// 初始化查询组件
QueryParser parser = new QueryParser(Version.LUCENE_43, field,
new IKAnalyzer(true));
Query query = parser.parse(searchText);
TopDocs td = search.search(query, 10000);// 获取匹配上元素的一个docid
ScoreDoc[] sd = td.scoreDocs;// 加载所有的Documnet文档
System.out.println("本次命中数据:" + sd.length);
QueryScorer scorer = new QueryScorer(query, "content");
Highlighter highlighter = new Highlighter(scorer);
highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));
for (ScoreDoc scoreDoc : sd) {
Document document = search.doc(scoreDoc.doc);
String content = document.get("content");
TokenStream tokenStream = TokenSources.getAnyTokenStream(
search.getIndexReader(), scoreDoc.doc, "content", document,
new IKAnalyzer(true));
System.out.println(highlighter
.getBestFragment(tokenStream, content));
}
}
}
测试代码:
@Test
public void test() throws IOException, InvalidTokenOffsetsException,
ParseException {
// fail("Not yet implemented");
HighlighterTest highlighterTest = new HighlighterTest();
highlighterTest.highlighter();
highlighterTest.highlighter_CSS("china");
highlighterTest.highlighter_CSS("poor");
highlighterTest.highlighter_SR("content", "床前明月光");
}
测试结果:
<B>China</B> has lots of people,most of them are very poor。<B>China</B> is very big.<B>China</B> become strong now,but the poor people is also poor than other controry
<span style="backgroud:red">China</span> has lots of people,most of them are very poor。<span style="backgroud:red">China</span> is very big.<span style="backgroud:red">China</span> become strong now,but the poor people is also poor than other controry
China has lots of people,most of them are very <span style="backgroud:red">poor</span>。China is very big.China become strong now,but the <span style="backgroud:red">poor</span> people is also <span style="backgroud:red">poor</span> than other controry
本次命中数据:1
<B>床</B><B>前</B><B>明月光</B>,疑是地上霜
【本例参考《Lucene In Action》】
分享到:
相关推荐
在这个SpringBoot+Lucene的Demo中,我们将深入探讨如何在Spring Boot框架下集成Lucene,并实现搜索结果的高亮显示。 首先,让我们了解Spring Boot。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化...
### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。而在搜索结果中实现关键词高亮显示,可以极大地提升用户体验,让用户快速定位到搜索词所在的位置。本文...
本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...
中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是Apache软件基金会的一个开放源...
标题"自己修改的基于lucene.net 2.9和highlighter插件的简单例子"表明这是一个示例项目,演示了如何在Lucene.NET 2.9版本上结合Highlighter插件进行操作。Lucene.NET是Apache Lucene搜索引擎库的.NET版本,用于实现...
**Lucene高亮显示** 在信息检索领域,用户通常希望在搜索结果中快速找到与查询相关的关键词,这就是所谓的“高亮显示”。Apache Lucene是一个强大的全文搜索引擎库,它提供了多种功能,包括高亮显示搜索结果。高亮...
3. **Highlighter模块**:`lucene-highlighter-2.4.0.jar` 提供了高亮显示查询匹配部分的功能,这在用户界面中展示搜索结果时非常有用,可以突出显示与查询相关的关键词。 4. **示例和文档**:除了库文件外,这个...
“Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...
本文将详细介绍三种常用的高亮显示方法,这些方法基于Lucene框架,适用于不同的场景和需求。 ### 1. 基于字符串替换的高亮显示 这是最基础也是最简单的高亮显示实现方式。其核心思想是通过字符串匹配,找到搜索词...
在本示例中,我们将探讨如何使用Lucene进行基本的增删改查操作,并且了解如何处理中文文档以及利用Luke工具进行索引分析,以及实现搜索结果的高亮显示。 首先,让我们深入理解Lucene的基础概念。Lucene的核心是建立...
在提供的"lucene5.2.1入门经典案例"中,你可以找到如何创建索引、执行查询、高亮显示结果等具体操作的示例代码。这些案例可以帮助初学者快速理解和应用Lucene-5.2.1的核心功能。通过实践,你可以更深入地了解Lucene...
- 分页和高亮显示:限制每次返回的结果数量,使用 `Highlighter` 高亮匹配的关键词。 综上所述,Lucene 示例项目提供了完整的站内搜索解决方案,涉及数据预处理、索引构建、查询执行、结果处理等多个环节。通过学习...
Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会指导如何配置和使用Highlighter,以优雅地展示搜索结果。 5. **多字段与多语言支持**: Lucene 支持在一个...
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
本篇文章主要探讨如何利用Lucene实现文件摘要的自动提取,并进行关键词高亮显示。这一过程涉及到Lucene的Highlighter组件,它专门用于突出显示搜索结果中的关键词。 首先,我们了解Lucene的Highlighter是如何工作的...
4. **高亮显示**:搜索结果中匹配的查询词可以被高亮显示,使用`Highlighter`类实现。 5. **更新和删除索引**:`IndexWriter`支持动态添加、删除和更新文档,保持索引实时性。 6. **多线程和分布式**:Lucene支持...
`contrib`目录包含了社区开发的附加组件,如 SpellChecker(拼写检查)、Highlighter(高亮显示) 和 Ant任务等,它们丰富了Lucene的功能,满足更多应用场景。 通过对`lucene-3.3.0-src.zip`源码的深入学习,...
- **高亮显示**:`lucene-highlighter-2.9.3.jar`提供高亮搜索结果的功能,可以在搜索结果中突出显示匹配的关键词。 - **优化**:定期合并小段以提高搜索效率,可以使用IndexWriter的optimize方法。 总的来说,...
本文将围绕“lucene.net完整源码”进行深入探讨,包括其分词机制、盘古分词的使用以及搜索关键词的高亮显示。 首先,我们来看Lucene.NET的核心——分词。在信息检索领域,分词是构建索引的基础步骤,它将文本分解...
标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...