- 浏览: 915231 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (445)
- 备忘 (0)
- java基础 (28)
- jsp (15)
- css (4)
- javascript (30)
- struts (7)
- servlet (2)
- struts2 (7)
- jdbc (16)
- hibernate (22)
- ibatis (0)
- jpa (1)
- spring (17)
- spring定时任务 (8)
- 整合开发 (12)
- JavaArticle (0)
- php (6)
- velocity (2)
- mysql (19)
- sqlserver (52)
- oracle (23)
- lucene (49)
- ajax (13)
- dwr (5)
- JFreeChart (1)
- service (14)
- tools (18)
- c#基础 (20)
- 程序安全 (0)
- 学习网站 (1)
- 社会需求 (2)
- flash (1)
- 流媒体 (1)
- java_code (1)
- htmlparser (1)
- 速动画教程 (5)
- 设计模式 (1)
- xml操作 (2)
- uml操作 (4)
- 测试 (1)
- linux (8)
- 版本控制 (4)
- 服务器 (12)
- 安全 (6)
- 美工 (2)
最新评论
-
Zhang_amao:
我想问一下, 你用的lucene版本和highligher的版 ...
使用Lucene的Highlighter实现文件摘要的自动提取 -
wangmengfanwangzhi:
博主,你的QQ是什么啊?有关于lucene的问题想要请教啊~~ ...
Lucene下载及测试 -
cutesunshineriver:
讲得很好,理解起来很顺,对个人学习的帮助性很大,谢谢博主。
velocity入门一 -
libin2722:
我这里有一个任务调度,在晚上3点时候会自动将数据库中某表的数据 ...
Lucene-2.2.0 源代码阅读学习(16) -
greatwqs:
java -cp $JVM_ARGS $classpath ...
java的cp命令
在Lucene的org.apache.lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。使用百度、Google搜索的时候,检索结果显示的时候,在摘要中实现与关键字相同的词条进行高亮显示,百度和Google指定红色高亮显示。
有了Lucene提供的高亮显示的工具,可以很方便地实现高亮显示的功能。
高亮显示,就是根据用户输入的检索关键字,检索找到该关键字对应的检索结果文件,提取对应于该文件的摘要文本,然后根据设置的高亮格式,将格式写入到摘要文本中对应的与关键字相同或相似的词条上,在网页上显示出来,该摘要中的与关键字有关的文本就会以高亮的格式显示出来。
Lucene中org.apache.lucene.search.highlight.SimpleHTMLFormatter类可以构造一个高亮格式,这是最简单的构造方式,例如:
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
构造方法声明为public SimpleHTMLFormatter(String preTag, String postTag),因为这种高亮格式是依赖于网页文件的,HTML文件中是以标记(tag)来标识的,即存在一个preTag和一个postTag。
上面构造的高亮格式是摘要中出现的关键字使用红色来显示,区分其它文本。
通过构造好的高亮格式对象,来构造一个org.apache.lucene.search.highlight.Highlighter实例,然后根据对检索结果得到的Field的文本内容(这里是指摘要文本)进行切分,找到与检索关键字相同或相似的词条,将高亮格式加入到摘要文本中,返回一个新的、带有格式的摘要文本,在网页上就可以呈现高亮显示。
下面实现一个简单的例子,展示实现高亮显示的处理过程。
测试类如下所示:
package org.shirdrn.lucene.learn.highlight;
import java.io.IOException;
import java.io.StringReader;
import net.teamhot.lucene.ThesaurusAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
public class MyHighLighter {
private String indexPath = "F:\\index";
private Analyzer analyzer;
private IndexSearcher searcher;
public MyHighLighter(){
analyzer = new ThesaurusAnalyzer();
}
public void createIndex() throws IOException { // 该方法建立索引
IndexWriter writer = new IndexWriter(indexPath,analyzer,true);
Document docA = new Document();
String fileTextA = "因为火烧云总是燃烧着消失在太阳冲下地平线的时刻,然后便是宁静的自然的天籁,没有谁会在这样的时光的镜片里伤感自语,因为灿烂给人以安静的舒适感。";
Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
docA.add(fieldA);
Document docB = new Document();
String fileTextB = "因为带有以伤痕为代价的美丽风景总是让人不由地惴惴不安,紧接着袭面而来的抑或是病痛抑或是灾难,没有谁会能够安逸着恬然,因为模糊让人撕心裂肺地想呐喊。";
Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);
docB.add(fieldB);
Document docC = new Document();
String fileTextC = "我喜欢上了一个人孤独地行游,在梦与海洋的交接地带炽烈燃烧着。"+
"因为,一条孤独的鱼喜欢上了火焰的颜色,真是荒唐地不合逻辑。";
Field fieldC = new Field("contents", fileTextC, Field.Store.YES,Field.Index.TOKENIZED);
docC.add(fieldC);
writer.addDocument(docA);
writer.addDocument(docB);
writer.addDocument(docC);
writer.optimize();
writer.close();
}
public void search(String fieldName,String keyword) throws CorruptIndexException, IOException, ParseException{ // 检索的方法,并实现高亮显示
searcher = new IndexSearcher(indexPath);
QueryParser queryParse = new QueryParser(fieldName, analyzer); // 构造QueryParser,解析用户输入的检索关键字
Query query = queryParse.parse(keyword);
Hits hits = searcher.search(query);
for(int i=0;i<hits.length();i++){
Document doc = hits.doc(i);
String text = doc.get(fieldName);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(text.length()));
if (text != null) {
TokenStream tokenStream = analyzer.tokenStream(fieldName,new StringReader(text));
String highLightText = highlighter.getBestFragment(tokenStream, text);
System.out.println("★高亮显示第 "+(i+1) +" 条检索结果如下所示:");
System.out.println(highLightText);
}
}
searcher.close();
}
public static void main(String[] args) { // 测试主函数
MyHighLighter mhl = new MyHighLighter();
try {
mhl.createIndex();
mhl.search("contents", "因为");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
程序说明:
1、createIndex()方法:使用ThesaurusAnalyzer分析器为指定的文本建立索引。每个Document中都有一个name为contents的Field。在实际应用中,可以再构造一一个name为path的Field,指定检索到的文件的路径(本地路径或者网络上的链接地址)
2、根据已经建好的索引库进行检索。这首先需要解析用户输入的检索关键字,使用QueryParser,必须与后台使用的分析器相同,否则不能保证解析得到的查询(由词条构造)Query检索到合理的结果集。
3、根据解析出来的Query进行检索,检索结果集保存在Hits中。遍历,提取每个满足条件的Document的内容,程序中直接把它的内容当作摘要内容,实现高亮显示。在实际应用中,应该对应着一个提取摘要(或者检索数据库得到检索关键字对应的结果集文件的摘要内容)的过程。有了摘要以后,就可以为摘要内容增加高亮格式。
4、如果提取结果集文件的前N个字符串作为摘要,只需要在 highlighter.setTextFragmenter(new SimpleFragmenter(text.length())); 中设置显示摘要的字数,这里显示全部的文本作为摘要。
运行程序,结果如下所示:
词库尚未被初始化,开始初始化词库.
初始化词库结束。用时:3906毫秒;
共添加195574个词语。
★高亮显示第 1 条检索结果如下所示:
<font color='red'>因为</font>火烧云总是燃烧着消失在太阳冲下地平线的时刻,然后便是宁静的自然的天籁,没有谁会在这样的时光的镜片里伤感自语,<font color='red'>因为</font>灿烂给人以安静的舒适感。
★高亮显示第 2 条检索结果如下所示:
<font color='red'>因为</font>带有以伤痕为代价的美丽风景总是让人不由地惴惴不安,紧接着袭面而来的抑或是病痛抑或是灾难,没有谁会能够安逸着恬然,<font color='red'>因为</font>模糊让人撕心裂肺地想呐喊。
★高亮显示第 3 条检索结果如下所示:
我喜欢上了一个人孤独地行游,在梦与海洋的交接地带炽烈燃烧着。<font color='red'>因为</font>,一条孤独的鱼喜欢上了火焰的颜色,真是荒唐地不合逻辑。
上面的检索结果在HTML网页中,就会高亮显示关键字“因为”,显示为红色。
发表评论
-
创建索引的时候出现的错误
2010-01-04 10:13 1642<OFMsg>251658517"1&q ... -
SQLServer2005获取大数据集时内存不足的解决办法
2009-02-12 10:59 1944今天在修改search的建立索引的程序的时候,发现了这个错误 ... -
使用Lucene的Highlighter实现文件摘要的自动提取
2009-02-06 16:52 6572使用Lucene自带的Highlighter就可以实现对原始文 ... -
Lucene倒排索引原理
2009-02-06 16:08 1130Lucene是一个高性能的java全文检索工具包,它使用的是倒 ... -
Lucene 2.2.0发布自带的HTMLParser的使用
2009-02-06 16:00 2488Lucene 2.2.0发行包中自带 ... -
Lucene-2.2.0 源代码阅读学习(42)
2009-02-06 15:46 1309关于Hits类。这个Hits类 ... -
Lucene-2.2.0 源代码阅读学习(41)
2009-02-06 15:40 1081当执行Hits htis = search(query);这一 ... -
Lucene-2.2.0 源代码阅读学习(40)
2009-02-06 15:34 1168关于Lucene检索结果的排序问题。 已经知道,Lucene的 ... -
Lucene-2.2.0 源代码阅读学习(39)
2009-02-06 15:31 1099关于Lucene得分的计算。 在IndexSearcher类中 ... -
Lucene-2.2.0 源代码阅读学习(38)
2009-02-06 15:13 1104关于QueryParser。 QueryParser是用来解析 ... -
Lucene-2.2.0 源代码阅读学习(37)
2009-02-06 15:06 1038关于MultiTermQuery查询。 这里研究继承自Mult ... -
Lucene-2.2.0 源代码阅读学习(36)
2009-02-06 15:05 993关于MultiTermQuery查询。 这里研究FuzzyQu ... -
Lucene-2.2.0 源代码阅读学习(35)
2009-02-06 15:03 918于MultiPhraseQuery(多短语查询)。 Multi ... -
Lucene-2.2.0 源代码阅读学习(34)
2009-02-06 15:02 944关于PhraseQuery。 PhraseQuery查询是将多 ... -
Lucene-2.2.0 源代码阅读学习(33)
2009-02-06 15:01 966关于范围查询RangeQuery。 ... -
Lucene-2.2.0 源代码阅读学习(32)
2009-02-06 15:00 853关于SpanQuery(跨度搜索),它是Query的子类,但是 ... -
Lucene-2.2.0 源代码阅读学习(31)
2009-02-06 14:58 922关于前缀查询PrefixQuery(前缀查询)。 准备工作就是 ... -
Lucene-2.2.0 源代码阅读学习(30)
2009-02-06 14:57 725关于Query的学习。 主要使用TermQuery和Boole ... -
Lucene-2.2.0 源代码阅读学习(29)
2009-02-06 14:54 1124关于IndexSearcher检索器。 ... -
Lucene-2.2.0 源代码阅读学习(28)
2009-02-06 14:48 1256关于检索的核心IndexSearcher类。 IndexSea ...
相关推荐
该项目中包括创建索引,增删改查索引,以及关键字高亮显示实例~~对于初学者很有帮助,该项目是基于Lucene3.0
这是lucene的使用案例,实现了对word文档中的关键字检索,并将检索出的内容高亮打印出来
NULL 博文链接:https://iamyida.iteye.com/blog/2203575
这个是我自己写的Lucene与Mysql结合的例子,只是个简单的示例,加了高亮,看起来就更好点。欢迎大家拍砖。
使用lucene技术,实现android的本地文档资源的全文检索功能,并实现关键字高亮
整合Lucene搜索用户新闻项目实例,支持搜索关键词高亮,简单易懂
此资源配合《android+lucene实现全文检索并高亮关键字》使用http://download.csdn.net/detail/reality_jie/6335113
搜索的时候,不限制站点个数和顺序,支持关键字高亮显示。 管理后台:/admin/adminLogin.jsp username: jobcnn password: 123456 管理用户名和密码的更改在:\WEB-INF\classes\sys_setting.properties 文件里面配置...
使用visual studio 开发的lucene.net和盘古分词实现全文检索。并按照lucene的得分算法进行多...有点小bug,在这个字段没有关键字的时候可能会不显示数据, 如果要是只看全文检索,可以自己去掉高亮,看一下检索结果。
lucene3.6.2及highlighter jar包 可以把关键字在搜索结果中高亮显示
DotLucene演示源码 DotLucene实际是Lucene的Asp.net版本,也称为lucene.net 该demo演示了Lucene的常用功能(智能分词、关键字高亮等)
android lucene实现全文检索并高亮关键字.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
经修改项目mysql版源码就是idea项目可以直接打开,存在sql脚本有sqlyog导出的脚本,可以导入到本地mysql使用,最好使用... (4)能够高亮显示搜索关键字 (5)显示查询所用的时间 (6)显示搜索历史、过滤关键字
1支持桌面文件搜索,格式包括txt、doc、xls和ppt; 2支持分词查询 3支持全文搜索 4能够高亮显示搜索关键字 5显示查询所用的时间 6显示搜索历史、过滤关键字
Lucene+MySql/Sqlserver2005 例子,自己在学习lucene的过程中,做了这个小列子,是根据数据库的内容来创建索引,里面包括对查找的关键字进行高亮,对现实的内容进行了限定.对Lucene还没有进入深入的理解,里面的代码...
这是一个实现Lucene全文搜索多种文件格式的一个小项目。包括对搜索到得内容中的搜索字进行高亮显示,就是实现像百度那样对搜索的关键字标红。
使用Lucene框架写的索引的增、删、改、查组件,支持高亮关键字
lucene的用法,里面包含基本的用法还有分词,还有高亮显示,并且有JAR包
(4)能够高亮显示搜索关键字 (5)显示查询所用的时间 (6)显示搜索历史、过滤关键字 摘要: 我们处在一个大数据的时代,伴随着网络信息资源的庞大,人们越来越多地注重怎样才能快速有效地从海量的网络信息中...