`
Mr_Tank_
  • 浏览: 22554 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【Lucene】三个高亮显示模块的简单示例-Highlighter

 
阅读更多

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

    在这个SpringBoot+Lucene的Demo中,我们将深入探讨如何在Spring Boot框架下集成Lucene,并实现搜索结果的高亮显示。 首先,让我们了解Spring Boot。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化...

    lucene高亮显示

    ### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。而在搜索结果中实现关键词高亮显示,可以极大地提升用户体验,让用户快速定位到搜索词所在的位置。本文...

    lucene 多字段查询+文字高亮显示

    本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是Apache软件基金会的一个开放源...

    自己修改的基于lucene.net 2.9和highlighter插件的简单例子

    标题"自己修改的基于lucene.net 2.9和highlighter插件的简单例子"表明这是一个示例项目,演示了如何在Lucene.NET 2.9版本上结合Highlighter插件进行操作。Lucene.NET是Apache Lucene搜索引擎库的.NET版本,用于实现...

    lucence高亮显示

    **Lucene高亮显示** 在信息检索领域,用户通常希望在搜索结果中快速找到与查询相关的关键词,这就是所谓的“高亮显示”。Apache Lucene是一个强大的全文搜索引擎库,它提供了多种功能,包括高亮显示搜索结果。高亮...

    最全的lucene-2.4.0jar包

    3. **Highlighter模块**:`lucene-highlighter-2.4.0.jar` 提供了高亮显示查询匹配部分的功能,这在用户界面中展示搜索结果时非常有用,可以突出显示与查询相关的关键词。 4. **示例和文档**:除了库文件外,这个...

    Lucene与数据库结合示例(加双关键字高亮)

    “Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...

    个人搜索引擎开发的三种高亮显示的方法小结

    本文将详细介绍三种常用的高亮显示方法,这些方法基于Lucene框架,适用于不同的场景和需求。 ### 1. 基于字符串替换的高亮显示 这是最基础也是最简单的高亮显示实现方式。其核心思想是通过字符串匹配,找到搜索词...

    lucene事例(包含基本增删改查、中文词分器、高亮显示等)

    在本示例中,我们将探讨如何使用Lucene进行基本的增删改查操作,并且了解如何处理中文文档以及利用Luke工具进行索引分析,以及实现搜索结果的高亮显示。 首先,让我们深入理解Lucene的基础概念。Lucene的核心是建立...

    最新全文检索 lucene-5.2.1 入门经典实例

    在提供的"lucene5.2.1入门经典案例"中,你可以找到如何创建索引、执行查询、高亮显示结果等具体操作的示例代码。这些案例可以帮助初学者快速理解和应用Lucene-5.2.1的核心功能。通过实践,你可以更深入地了解Lucene...

    lucene 站内搜索示例

    - 分页和高亮显示:限制每次返回的结果数量,使用 `Highlighter` 高亮匹配的关键词。 综上所述,Lucene 示例项目提供了完整的站内搜索解决方案,涉及数据预处理、索引构建、查询执行、结果处理等多个环节。通过学习...

    lucene-4.6.1官方文档

    Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会指导如何配置和使用Highlighter,以优雅地展示搜索结果。 5. **多字段与多语言支持**: Lucene 支持在一个...

    Lucene3.0增删改查和关键字高亮实例

    在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...

    用lucene实现摘要的高亮点

    本篇文章主要探讨如何利用Lucene实现文件摘要的自动提取,并进行关键词高亮显示。这一过程涉及到Lucene的Highlighter组件,它专门用于突出显示搜索结果中的关键词。 首先,我们了解Lucene的Highlighter是如何工作的...

    Lucene的原理完整版pdf

    4. **高亮显示**:搜索结果中匹配的查询词可以被高亮显示,使用`Highlighter`类实现。 5. **更新和删除索引**:`IndexWriter`支持动态添加、删除和更新文档,保持索引实时性。 6. **多线程和分布式**:Lucene支持...

    lucene-3.3.0-src.zip

    `contrib`目录包含了社区开发的附加组件,如 SpellChecker(拼写检查)、Highlighter(高亮显示) 和 Ant任务等,它们丰富了Lucene的功能,满足更多应用场景。 通过对`lucene-3.3.0-src.zip`源码的深入学习,...

    Lucene对本地文件多目录创建索引

    - **高亮显示**:`lucene-highlighter-2.9.3.jar`提供高亮搜索结果的功能,可以在搜索结果中突出显示匹配的关键词。 - **优化**:定期合并小段以提高搜索效率,可以使用IndexWriter的optimize方法。 总的来说,...

    lucene.net完整源码

    本文将围绕“lucene.net完整源码”进行深入探讨,包括其分词机制、盘古分词的使用以及搜索关键词的高亮显示。 首先,我们来看Lucene.NET的核心——分词。在信息检索领域,分词是构建索引的基础步骤,它将文本分解...

    使用Lucene4.7实现搜索功能,分页+高亮

    标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...

Global site tag (gtag.js) - Google Analytics