`
liuwei1981
  • 浏览: 769266 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160476
社区版块
存档分类
最新评论

Lucene实现搜索结果命中关键字高亮显示

阅读更多

     使用lucene实现搜索结果 命中关键字高亮显示,大致流程与lucene 建立文件索引和针对索引进行搜索(lucene2.2版本)介绍的一致,只需在代码里稍作修改。


   1.索引生成过程:(红色为修改部分,针对需要进行高亮显示索引内容,进行分词与关键字位置索引)

package demo.example.searcher;

import java.io.*;
import java.util.*;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.index.*;
import org.apache.lucene.document.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Indexer {
	private static Log log = LogFactory.getLog(Indexer.class);

	public static void main(String[] args) throws Exception {
		File indexDir = new File("C:\\index");
		File dataDir = new File("C:\\lucene\\src");

		long start = new Date().getTime();

		int numIndexed = index(indexDir, dataDir);

		long end = new Date().getTime();

		System.out.println("use:" + (end - start));
	}

	public static int index(File indexDir, File dataDir) {
		int ret = 0;
		try {
			IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true);
			writer.setUseCompoundFile(false);

			indexDirectory(writer, dataDir);

			ret = writer.docCount();
			writer.optimize();
			writer.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	public static void indexDirectory(IndexWriter writer, File dir) {
		try {
			File[] files = dir.listFiles();

			for (File f : files) {
				if (f.isDirectory()) {
					indexDirectory(writer, f);
				} else {
					indexFile(writer, f);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void indexFile(IndexWriter writer, File f) {
		try {
			System.out.println("Indexing:" + f.getCanonicalPath());
			Document doc = new Document();
			Reader txtReader = new FileReader(f);

			doc.add(new Field("contents", txtReader,Field.TermVector.WITH_POSITIONS_OFFSETS));
			doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));

			writer.addDocument(doc);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



2.搜索过程,红色的为修改部分,需要highlight和analysis的lucene的jar文件

 

package demo.example.searcher;

import java.util.*;

import org.apache.lucene.search.highlight.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.search.*;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.document.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Searcher {
	private static Log log = LogFactory.getLog(Searcher.class);

	public static void main(String[] args) {
		String indexDir = "C:\\index";
		String q = "查询关键字";
		search(indexDir, q);
	}

	public static void search(String indexDir, String q) {
		try {
			IndexSearcher is = new IndexSearcher(indexDir);

			QueryParser queryParser = new QueryParser("contents", new StandardAnalyzer());
			Query query = queryParser.parse(q);
			long start = new Date().getTime();

			Hits hits = is.search(query);

			long end = new Date().getTime();

			System.out.println("use:" + (end - start));
                                                

 

   SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<strong><font color='red'>", "</font></strong>");
   SimpleFragmenter fragmenter = new SimpleFragmenter(60);

 

   Highlighter highlighter = new Highlighter(formatter, new QueryScorer(q));
   highlighter.setTextFragmenter(fragmenter);

 

   int maxNumFragmentsRequired = 10;
   String fragmentSeparator = "";
   TermPositionVector tpv = null;
   TokenStream tokenstream = null;

 

			for (int i = 0; i < hits.length(); i++) {
				Document doc = hits.doc(i);

 

                                                                 int id = hits.id(i);

 

				System.out.println("The right file:" + doc.get("filename"));

 

 tpv = (TermPositionVector) is.getIndexReader().getTermFreqVector(id, "contents");     

 

 tokenstream = TokenSources.getTokenStream(tpv);

 

String result = highlighter.getBestFragments(tokenstream, doc.get("contents"),
       maxNumFragmentsRequired, fragmentSeparator)

 

 System.out.println("The right file context is :" + result);

 

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}



   在输出结果中,文件内容中命中的关键字被加上了

"<strong><font color='red'>", "</font></strong>"


   在网页中显示内容,即为黑体红字显示效果。

 

分享到:
评论

相关推荐

    Lucene5学习之Highlighte关键字高亮

    在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的Highlighter模块。Lucene是一个开源全文检索库,它...

    Lunene分页关键字高亮显示

    标题 "Lunene分页关键字高亮显示" 暗示了我们正在讨论一个与搜索引擎或数据检索相关的项目,其中涉及到了Lunene(可能是Lucene的误拼),一种广泛使用的全文搜索引擎库,以及如何在搜索结果中实现分页和关键字高亮。...

    android+lucene实现全文检索并高亮关键字索引库

    在Android平台上实现全文检索并高亮关键字,常常需要用到开源全文搜索引擎Lucene。Lucene是一个高性能、全文本搜索库,提供了一个简单但强大的应用编程接口(API)用于索引和搜索文本。下面我们将深入探讨如何在...

    android+lucene实现全文检索并高亮关键字

    5. **高亮显示关键字**:为了高亮显示搜索结果中的关键字,可以使用Highlighter组件。首先,需要将搜索结果的文档内容分词,然后使用QueryScorer计算每个词项的相关性得分。最后,使用Formatter类将得分高的关键字用...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

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

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

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

    总的来说,Lucene的多字段查询和文字高亮显示是提高用户体验和增强搜索功能的关键技术。它们使得用户能够更快地找到相关信息,并且更直观地看到搜索结果中的关键匹配点。通过深入学习和实践,你可以在自己的项目中...

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

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

    SpringBoot+Lucene搜索结果高亮显示Demo

    **SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...

    安卓搜索相关相关-androidlucene实现全文检索并高亮关键字.rar

    这个压缩包"安卓搜索相关相关-androidlucene实现全文检索并高亮关键字.rar"显然包含了一种利用Apache Lucene库在Android平台上实现这一功能的方法。Apache Lucene是一个强大的开源全文搜索引擎库,它提供了高效的...

    Lucene5学习之Suggest关键字提示

    在实际应用中,我们还需要关注如何将Suggest与现有的Lucene搜索系统集成,以及如何设计合理的权重策略以提供最有价值的建议。同时,对于大型项目,可能需要考虑分布式Suggest服务,以应对高并发请求。 总之,Lucene...

    利用lucene实现文档关键字检索

    在这个使用案例中,我们将深入探讨如何利用Lucene实现对Word文档中的关键字检索并高亮显示结果。 首先,我们需要理解Lucene的基本工作原理。Lucene通过建立倒排索引(Inverted Index)来加速查询。倒排索引是一种...

    IKAnalyzer LUCENE.4.9 中文分词的高亮显示

    标题"IKAnalyzer LUCENE.4.9 中文分词的高亮显示"表明我们将探讨如何使用IKAnalyzer与Lucene 4.9版本相结合,实现搜索结果的关键词高亮功能。高亮显示有助于用户快速识别和理解搜索结果中的重要信息。 IKAnalyzer的...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    lucene高亮显示

    Lucene的高亮显示是指在搜索结果中,对匹配查询关键词的部分进行突出显示,通常用不同颜色或者加粗等方式实现。这不仅能够帮助用户迅速识别搜索结果的相关性,还能提高搜索结果的可读性和吸引力。 #### 二、高亮...

    lucene 高亮显示. java

    Lucene是一款高性能、全功能的文本搜索引擎库,其高亮显示功能主要用于在搜索结果中突出显示与查询条件相匹配的关键词,这不仅提升了用户体验,还能帮助用户快速定位关键信息。 ### 中文分词对性能的影响 在使用...

    Lucene+HighLighter高亮显示实例

    本篇文章将深入探讨如何利用Apache Lucene这个强大的全文搜索引擎库,结合Highlighter组件实现搜索结果的高亮显示。 Apache Lucene是一个高性能、可扩展的开源全文检索库,它提供了完整的索引和搜索功能,使得...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--dic

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    整合Lucene搜索用户新闻项目实例,支持搜索关键词高亮

    本项目实例将详细介绍如何整合Lucene到一个用户新闻系统中,以实现高效的新闻搜索功能,并支持搜索关键词的高亮显示。 首先,我们需要了解Lucene的基本概念。Lucene是一个纯Java库,它提供了索引和搜索文本的工具,...

    lucene3.6.1文件关键字搜索代码(附加核心包)

    在描述中提到的"JAVA全局文件夹搜索案例",是指使用Lucene实现的Java程序,可以遍历指定的文件夹,对其中的文件内容进行索引,然后根据用户输入的关键字进行实时搜索。这样的案例有助于初学者理解Lucene如何与文件...

Global site tag (gtag.js) - Google Analytics