在Lucene的org.apache.lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。我们在使用百度、Google搜索的时候,检索结果显示的时候,在摘要中实现与关键字相同的词条进行高亮显示,百度和Google指定红色高亮显示。
有了Lucene提供的高亮显示的工具,可以很方便地实现高亮显示的功能。
高亮显示,就是根据用户输入的检索关键字,检索找到该关键字对应的检索结果文件,提取对应于该文件的摘要文本,然后根据设置的高亮格式,将格式写入到摘要文本中对应的与关键字相同或相似的词条上,在网页上显示出来,该摘要中的与关键字有关的文本就会以高亮的格式显示出来。
高亮显示模块需要两个独立的输入:完整的原始文本以用来提供操作数据,以及来源于该文本的一个TokenStream。为了创建TokenStream,你必须对文本进行重新分析,此时需要使用与索引期间相同的分析器进行。
Highlighter依赖于词汇单元流中每个词汇单元的起始和结束位置偏移量来将原始输入文本中的字符片段进行精确定位,来用于高亮显示。
高亮处理的相关概念:
Fragmenter
作用是将原始字符串拆分成独立的片段。
NullFragmenter 是该接口的一个具体实现类,它将整个字符串作为单个片段返回,这适合于处理title域和前台文本较短的域,而对于这些域来说,我们是希望在搜索结果中全部展示。
SimpleFragmenter 是负责将文本拆分封固定字符长度的片段,但它并处理子边界。你可以指定每个片段的字符长度(默认情况100)但这类片段有点过于简单,在创建片段时,他并不限制查询语句的位置,因此对于跨度的匹配操作会轻易被拆分到两个片段中;
SimpleSpanFragmenter 是尝试将让片段永远包含跨度匹配的文档。
如果不Highlighter实例中设置Fragmenter,那么它会默认的SimpleFragmenter。
Scorer
Fragmenter输出的是文本片段序列,而Highlighter必须从中挑选出最适合的一个或多个片段呈现给客户,为了做到这点,Highlighter会要求Java接口Scorer来对每个片段进行评分。
Highlighter提供了两个Scorer具体实现类:QueryTermScorer和QueryScorer
QueryTermScorer 基于片段中对应Query的项数进行评分。
QueryScorer只对促成文档匹配的实际项进行评分。
Encoder
他的目的很简单,将初始文本编码成外部格式。该接口实现有两个:
DefaultEncoder:默认情况下供Hightlighter使用,它并不对文本进行任何操作。
SimpleHTMLEncoder:负责将文本编码成HTML,并忽略一些如< 、>以及其它非ASCII等特殊字符。一旦完成编码,最后一步就是对片段进行格式化处理向用户展现。
Formatter
它负责将片段转换成String形式,以及将被高亮显示的项一起用于搜索结果展示以及高亮显示。
public class Demo {
/**
* 将即将检索的资源写入索引库
* @param writer
* @throws Exception
*/
public void buildDocs(IndexWriter writer)throws Exception {
writer.deleteAll();//清空索引库里已存在的文档(document)
List<User> list = DataUtil.getUsers_more();//得到数据资源
System.out.println("buildDocs()->总人数为 :"+list.size());
for(User user :list){
Document doc = new Document();//创建索引库的文档
doc.add(new Field("id",String.valueOf(user.getId()),Store.YES,Index.NO));
doc.add(new Field("name",user.getName(),Store.YES,Index.ANALYZED));
doc.add(new Field("age",String.valueOf(user.getAge()),Store.YES,Index.ANALYZED));
doc.add(new Field("sex",user.getSex(),Store.YES,Index.ANALYZED));
doc.add(new Field("birthday",String.valueOf(user.getBirthday()),Store.YES,Index.ANALYZED));
writer.addDocument(doc);//将文档写入索引库
}
int count =writer.numDocs();
writer.forceMerge(100);//合并索引库文件
writer.close();
System.out.println("buildDocs()->存入索引库的数量:"+count);
}
}
public class HighlighterDemo extends Demo {
/**
* 从索引库中搜索你要查询的数据,并做最简单的高亮处理 html的<B>标签修饰
* @param searcher
* @throws IOException
* @throws InvalidTokenOffsetsException
* @throws ParseException
*/
public void searToHighlighter(Analyzer analyzer,IndexSearcher searcher) throws IOException, InvalidTokenOffsetsException, ParseException{
//Term term =new Term("sex", "男生");//查询条件,意思是我要查找性别为“男生”的人
//PrefixQuery query =new PrefixQuery(term);
QueryParser parser = new QueryParser(Version.LUCENE_36,"sex", analyzer);
Query query = parser.parse("男生");
TopDocs docs =searcher.search(query,null, 10);//查找
System.out.println("searcherDoc()->男生人数:"+docs.totalHits);
QueryScorer scorer=new QueryScorer(query);
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);
Highlighter highlight=new Highlighter(scorer);
highlight.setTextFragmenter(fragmenter);
int seq=0;
for(ScoreDoc doc:docs.scoreDocs){//获取查找的文档的属性数据
seq++;
int docID=doc.doc;
Document document =searcher.doc(docID);
String str="序号:"+seq+",ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:" ;
String value =document.get("sex");
if (value != null) {
TokenStream tokenStream = analyzer.tokenStream("sex", new StringReader(value));
String str1 = highlight.getBestFragment(tokenStream, value);
str=str+str1;
}
System.out.println("查询出人员:"+str);
}
}
/**
* 从索引库中搜索你要查询的数据,使用CSS进行高亮显示处理
* @param analyzer
* @param searcher
* @throws IOException
* @throws InvalidTokenOffsetsException
*/
public void searToHighlighterCss(Analyzer analyzer,IndexSearcher searcher) throws IOException, InvalidTokenOffsetsException{
Term term =new Term("sex", "男生");//查询条件,意思是我要查找性别为“男生”的人
TermQuery query =new TermQuery(term);
TopDocs docs =searcher.search(query, 10);//查找
System.out.println("searcherDoc()->男生人数:"+docs.totalHits);
/**自定义标注高亮文本标签*/
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span class=\"hightlighterCss\">","</span>");
/**创建QueryScorer*/
QueryScorer scorer=new QueryScorer(query);
/**创建Fragmenter*/
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);
Highlighter highlight=new Highlighter(formatter,scorer);
highlight.setTextFragmenter(fragmenter);
int seq=0;
for(ScoreDoc doc:docs.scoreDocs){//获取查找的文档的属性数据
seq++;
int docID=doc.doc;
Document document =searcher.doc(docID);
String str="序号:"+seq+",ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:" ;
String value =document.get("sex");
if (value != null) {
TokenStream tokenStream = analyzer.tokenStream("sex", new StringReader(value));
String str1 = highlight.getBestFragment(tokenStream, value);
str=str+str1;
}
System.out.println("查询出人员:"+str);
}
}
}
public class TestHighlighter {
private IndexWriter writer=null;
private Directory directory=null;
private IndexReader reader = null;
private IndexSearcher searcher=null;
private HighlighterDemo demo =new HighlighterDemo();
private Analyzer analyzer =null;
@Before
public void setUp() throws Exception {
directory = new SimpleFSDirectory(new File("F:/luc_dir"));
analyzer =new IKAnalyzer(); //new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,analyzer);
writer = new IndexWriter(directory,config);
}
@Test
public void testSearToHighlighter()throws Exception {
/**生成索引库*/
demo.buildDocs(writer);
/**查询数据*/
reader = IndexReader.open(directory);
searcher =new IndexSearcher(reader);
demo.searToHighlighter(analyzer,searcher);
}
@Test
public void testSearToHighlighterCss()throws Exception {
/**生成索引库*/
demo.buildDocs(writer);
/**查询数据*/
reader = IndexReader.open(directory);
searcher =new IndexSearcher(reader);
demo.searToHighlighterCss(new IKAnalyzer(),searcher);
}
}
testSearToHighlighter测试结果:
buildDocs()->总人数为 :100
buildDocs()->存入索引库的数量:100
searcherDoc()->男生人数:66
查询出人员:序号:1,ID:1,姓名:张三1,性别:我是<B>男生</B>
查询出人员:序号:2,ID:2,姓名:张三2,性别:我是<B>男生</B>
查询出人员:序号:3,ID:4,姓名:张三4,性别:我是<B>男生</B>
查询出人员:序号:4,ID:5,姓名:张三5,性别:我是<B>男生</B>
查询出人员:序号:5,ID:7,姓名:张三7,性别:我是<B>男生</B>
查询出人员:序号:6,ID:8,姓名:张三8,性别:我是<B>男生</B>
查询出人员:序号:7,ID:10,姓名:张三10,性别:我是<B>男生</B>
查询出人员:序号:8,ID:11,姓名:张三11,性别:我是<B>男生</B>
查询出人员:序号:9,ID:13,姓名:张三13,性别:我是<B>男生</B>
查询出人员:序号:10,ID:14,姓名:张三14,性别:我是<B>男生</B>
testSearToHighlighterCss 测试结果
buildDocs()->总人数为 :100
buildDocs()->存入索引库的数量:100
searcherDoc()->男生人数:66
查询出人员:序号:1,ID:1,姓名:张三1,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:2,ID:2,姓名:张三2,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:3,ID:4,姓名:张三4,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:4,ID:5,姓名:张三5,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:5,ID:7,姓名:张三7,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:6,ID:8,姓名:张三8,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:7,ID:10,姓名:张三10,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:8,ID:11,姓名:张三11,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:9,ID:13,姓名:张三13,性别:我是<span class="hightlighterCss">男生</span>
查询出人员:序号:10,ID:14,姓名:张三14,性别:我是<span class="hightlighterCss">男生</span>
分享到:
相关推荐
通过上述方法,不仅能够保持Lucene高亮显示功能的准确性,还能在处理中文分词时显著提升系统性能,特别是对于大数据量和高并发场景下的应用,这种优化显得尤为重要。Lucene的TermVector特性,配合合理的代码实现,为...
**SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...
在信息技术领域,搜索引擎的构建与优化是至关重要的一环,其中,如何有效地对搜索结果进行高亮显示,以突出关键信息,是提升用户体验的关键因素之一。本篇文章将深入探讨如何利用Apache Lucene这个强大的全文搜索...
### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。而在搜索结果中实现关键词高亮显示,可以极大地提升用户体验,让用户快速定位到搜索词所在的位置。本文...
下面我们将深入探讨如何在Android环境中利用Lucene来创建一个高效、功能丰富的全文检索系统,并了解如何高亮显示搜索结果中的关键字。 首先,我们要理解全文检索的基本原理。全文检索是指通过建立倒排索引来快速...
本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...
本文将深入探讨Lucene.NET如何进行中文分词以及高亮显示的实现。 ### 1. 中文分词 中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词...
lucene3.5高亮
标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...
《Lucene5学习之Highlighter关键字高亮》 在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的...
总之,通过使用Apache Lucene,Android应用可以提供强大的全文检索功能,同时高亮显示关键字,提升用户在查找本地文档时的体验。在实现过程中,需要注意资源管理、性能优化以及错误处理,确保在有限的Android环境中...
本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
这个标题提到的"java实现高亮显示的jar包,lucene用的jar包"是指利用Lucene库进行文本搜索时,对搜索结果进行高亮显示的相关功能。下面我们将深入探讨Lucene的核心组件、高亮显示的实现原理以及相关jar包的作用。 ...
本文将深入探讨如何在Lucene中实现高亮显示搜索结果和高效的分页功能,帮助开发者更好地理解和运用这个强大的工具。 一、Lucene简介 Lucene的核心功能是提供文本的索引和搜索,其内部实现了高效的倒排索引结构,...
本文将详细介绍如何使用Java和Lucene来实现HTML文本的高亮显示,以便用户在搜索结果中能快速识别关键词。提供的`HighLighterUtils.java`文件应该包含了实现这一功能的核心代码。 首先,我们需要理解高亮显示的基本...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
标题"IKAnalyzer LUCENE.4.9 中文分词的高亮显示"表明我们将探讨如何使用IKAnalyzer与Lucene 4.9版本相结合,实现搜索结果的关键词高亮功能。高亮显示有助于用户快速识别和理解搜索结果中的重要信息。 IKAnalyzer的...
在本教程中,我们将深入探讨Lucene中的高亮显示机制,这是搜索引擎返回结果时非常有用的一项功能,可以突出显示与查询匹配的关键字。在实际应用中,用户通常希望看到搜索词在文档中的确切位置,高亮显示使得这些匹配...
- **搜索结果高亮**: 为了提高用户阅读体验,Lucene 高亮包提供了搜索关键词在文档中的高亮显示功能,使用户能快速识别出匹配的关键词。 - **自定义样式**: 开发者可以自定义高亮的样式,如使用不同的颜色或者背景...