- 浏览: 339685 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
pacoson:
感谢楼主。请受小生一拜。
ANT预编译JSP -
zhuhongming123:
一楼的同学Lucene4.* 以上的 已经改成了Numeric ...
Lucene日期排序及组合查询 -
ywjk520:
RangeQuery在哪个包里?
Lucene日期排序及组合查询 -
willwen:
有个疑问,楼主,为何初始化bits 从txt读取已有的网址是直 ...
布隆过滤器(Bloom Filter)之java实例 -
yu_226528:
还不如没有呢
jFreeChart 在jsp页上实现简单的折线图、柱状图
注明:该类主要是符合本人项目的需求,内容摘要的高亮点实现没这么复杂,此类中不仅仅包含了内容的高亮点实现,还包含了获取xml内容和html纯文本的提取。注意一点的是在对内容进行高亮度化的过程中,其实也就是进行全文检索的过程,所以对文本内容进行分词是必不可少的。否则将无法找到文本中对应的关键词。详细请看类的实现
/* * @(#)SummaryHighlighter.java * Copyright(c) */ package com.chengyi.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import javax.swing.ListCellRenderer; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cw.Segmenter; import org.apache.lucene.analysis.cw.SegmenterUtils; import org.apache.lucene.queryParser.QueryParser; 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.SimpleHTMLFormatter; import org.htmlparser.util.ParserException; import org.w3c.dom.CDATASection; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /** * 用lucene实现搜索结果的高亮度 * * @version 1.0 2009.02.03 * @author zhx * */ public class SummaryHighlighter { /** 高亮度内容属性,只是有标识作用,没有具体意义*/ private static String CONTENT = "content"; /** * 实现内容摘要的高亮点 * 此方法传入的xmlContent内容是一个xml文本(格式见测试文件2.txt),我们需根据该xml的结构进行 * 分析,并提取该xml中的文本,特殊的是从xml中提取出来的文本又是html格式,所以又得做第二次提取, * 才能获取到纯文本 * * @param content * 需高亮度内容 * @param keyWord * 高亮度关键字 * @return 高亮度摘要 */ public static String getHighlighterSummary(String xmlContent, String keyWord) { // TODO Auto-generated method stub String hightContent = ""; String segmenterContent = ""; String htmlContent = ""; String content = ""; // 获取html内容 htmlContent = SummaryHighlighter.getHtmlContentFromXML(xmlContent); // 从html中提取纯文本 content = SummaryHighlighter.getTextFromHtml(htmlContent); //System.out.println("提取到的纯文本:" + content); // 对内容进行分词 segmenterContent = SummaryHighlighter.segmentString(content); // Analyzer analyzer = new CWordAnalyzer(); Analyzer analyzer = new SimpleAnalyzer(); QueryParser queryParser = new QueryParser(CONTENT, analyzer); // 设置相似度 queryParser.setFuzzyMinSim(0.9f); try { //分析关键词 Query query = queryParser.parse(segmentString(keyWord)); // Term term=new Term(CONTENT,keyWord); // Query query = new TermQuery(term); QueryScorer scorer = new QueryScorer(query); Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter( "<font color=\"#cc0033\">", "</font>"), scorer); Reader reader = new StringReader(segmenterContent); TokenStream tokenStream = analyzer.tokenStream(CONTENT, reader); //获取高亮点后的内容 hightContent = highlighter.getBestFragments(tokenStream, segmenterContent, 0, "..."); //去除内容中的空格 hightContent = hightContent.replace(" ", "").replace( "<fontcolor=\"#cc0033\">", "<font color=\"#cc0033\">"); //System.out.println(hightContent); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (org.apache.lucene.queryParser.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return hightContent; } /** * 分词处理 * * @param in * 处理内容 * @return 分词后的内容 */ public static String segmentString(String in) { String ret = null; Segmenter mainsegmenter; try { mainsegmenter = SegmenterUtils.getSegmenter(System .getProperty("java.io.tmpdir") + "/zword.obj"); StringBuffer buffer = null; if (mainsegmenter != null) { BufferedReader bin = new BufferedReader(new StringReader(in)); buffer = new StringBuffer(); String dataline; String processed; try { while ((dataline = bin.readLine()) != null) { processed = mainsegmenter.segmentLine(dataline, " "); buffer.append(processed).append("\n"); } } catch (IOException ioe) { // ignored } finally { try { bin.close(); } catch (Exception e) { } } } else { } if (buffer != null) { ret = buffer.toString(); } } catch (ClassCastException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // System.out.println(buffer.toString()); return ret; } /** * 读取一个文件到字符串里. * * @param sFileName * 文件名 * @param sEncode * String * @return 文件内容 */ public static String readTextFile(String sFileName, String sEncode) { StringBuffer sbStr = new StringBuffer(); try { File ff = new File(sFileName); InputStreamReader read = new InputStreamReader(new FileInputStream( ff), sEncode); BufferedReader ins = new BufferedReader(read); String dataLine = ""; while (null != (dataLine = ins.readLine())) { sbStr.append(dataLine); // sbStr.append("\r\n"); } ins.close(); } catch (Exception e) { e.printStackTrace(); } //System.out.println("读入的文章内容:" + sbStr.toString()); return sbStr.toString(); } /** * 从xml中获取内容,此方法对应测试文件2.txt的节点结构,目的是获取<![cdata[.....]]>中的内容 * * @param xmlContent * xml内容 * @return 提取出来的内容 */ public static String getHtmlContentFromXML(String xmlContent) { xmlContent = xmlContent.replaceAll("UTF-8", "GBK"); String content = ""; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; try { builder = factory.newDocumentBuilder(); org.w3c.dom.Document doc = builder.parse(new ByteArrayInputStream( xmlContent.getBytes())); // normalize text representation doc.getDocumentElement().normalize(); NodeList listOfContents = doc .getElementsByTagName("static-content"); int totalContents = listOfContents.getLength(); // System.out.println("Total no of people : " + totalContents); for (int s = 0; s < listOfContents.getLength(); s++) { Node contentNode = listOfContents.item(s); NodeList listOfCdata = contentNode.getChildNodes(); int totalCdata = listOfCdata.getLength(); for (int i = 0; i < totalCdata; i++) { Node cdataNode = listOfCdata.item(i); if (cdataNode.getNodeType() == Node.CDATA_SECTION_NODE) { CDATASection cdataSection = (CDATASection) cdataNode; content = cdataSection.getWholeText(); // System.out.print(content); } /* * if (node1.getNodeType() == Node.TEXT_NODE) { n++; String * type = node1.getNodeName(); System.out.println("第" + n + * "个是" + type + "节点,内容:"); Text textNode = (Text) node1; * String content = textNode.getWholeText(); * System.out.print(content); } */ }// end of if clause }// end of for loop with s var } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (org.xml.sax.SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return content; } /** * 提取html中的纯文本内容 * * @param htmlContent html内容 * @return 纯文本内容 */ public static String getTextFromHtml(String htmlContent) { boolean bContent = true; StringBuffer sBuffer = new StringBuffer(8096 * 2); char[] cBuffer = htmlContent.toCharArray(); int nCount = cBuffer.length; for (int i = 0; i < nCount; i++) { if (bContent == false) { if (cBuffer[i] == '>') bContent = true; else continue; } else { if (cBuffer[i] == '<') { bContent = false; continue; } else if (cBuffer[i] == '\n' || cBuffer[i] == ' ' || cBuffer[i] == ' ' || cBuffer[i] == ' ') { continue; } else if (cBuffer[i] == '&' && cBuffer[i + 1] == 'n' && cBuffer[i + 2] == 'b' && cBuffer[i + 3] == 's' && cBuffer[i + 4] == 'p' && cBuffer[i + 5] == ';') { i = i + 5; continue; } sBuffer.append(cBuffer[i]); } } return sBuffer.toString(); } /** * test * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String content = SummaryHighlighter.readTextFile("d:/2.txt", "gbk"); String keyWord = "中国"; SummaryHighlighter.getHighlighterSummary(content, keyWord); } }
测试文件2.txt的内容:
<?xml version='1.0' encoding='UTF-8'?>
<root available-locales="en_US," default-locale="en_US">
<static-content language-id="en_US">
<![CDATA[<p> 凡中国产业集群网在<a href="http://www.csic99.com">www.csic99.com</a>运作的网站明确标示由中国产业集群合作伙伴运营的中国产业集群该城市网页及该城市的相关页面,均由中国产业集群的合作伙伴按照中国产业集群授权书及中国产业集群网的用户协议、使用规则等规定,在其所获得授权范围与授权期限内予以运营中国产业集群在此申明会积极帮助您,以支持您合法权益得到保障。 <br /> 因中国产业集群合作伙伴在其被授权范围与期限内,按照法律法规规定及中国产业集群网的相关规定,所作之行为,如果您认为损害到了您的合法权益,您可以按照中国产业集群网约定的办法予以解决;中国产业集群合作伙伴在其被 授权范围以外或违反 法律法规规定及违反中国产业集群网的规定,所作之行为( 包括网上及非网上行为)而使您(任何中国产业集群网用户或任何第三方)受到的任何损失,或与一名或多名用户发生争议,就上述损失和/或争议产生或在任何方面与上述损失和/或争议有关的每一种类和性质的已知或未知、可疑或非可疑、披露或未披露的索赔、要求和损害,特此申明如下:鉴于中国产业集群合作伙伴之授权范围自其被授权之日起,已在本网站显著位置予以公开,中国产业集群网的用户协议及相关规定与免责申明等也在本网站显著位置予以,且中国产业集群仅作为网上分发信息的渠道,而并非信息的发布方,同时,中国产业集群没有事先审核用户上传的内容,也没有事后参与用户之间的实际联络之义务,故对于因为中国产业集群合作伙伴在其被授权范围以外或违反法律法规规定及中国产业集群网的相关规定,所作之行为(包括网上及非网上行为)而使您受到任何损失,或与一名或多名用户发生争议,就上述损失和/或争议产生或在任何方面与上述损失和/或争议有关的每一种类和性质的已知或未知、可疑或非可疑、披露或未披露的索赔、要求和损害, 特此申明免除中国产业集群(和中国产业集群的高级职员、董事、代理人、关联公司、母公司、子公司和雇员)的任何责任。 <br />请您仔细阅读相关授权文书,本网站用户协议及相关规定与免责申明等,以避免不必要的损失。 中国产业集群网</p>]]>
</static-content>
</root>
发表评论
-
布隆过滤器(Bloom Filter)之java实例
2010-08-26 14:40 6349在日常生活中,包括在设计计算机软件时,我们经常要判断一个 ... -
Lucene查询语法详解
2010-07-16 10:55 1196Lucene提供了丰富的API来 ... -
使用Lucene的Highlighter实现文件摘要的自动提取
2010-07-03 15:19 1391使用Lucene自带的Highlighter就可以实现对原始文 ... -
ICTCLAS 中科院分词系统 代码 注释 中文分词 词性标注
2010-04-16 15:45 1753中科院分词系统概述 这几天看完了中科院分词程序的代码,现在来 ... -
Lucene日期排序及组合查询
2009-11-19 14:31 4789public class SearchUtil { //索 ... -
Lucene中自定义排序的实现
2009-11-07 17:59 920使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要 ... -
在Lucene中应用poading进行分词
2009-11-07 17:52 12231、下载poading解牛 http://code.googl ... -
Lucene日期索引搜索
2009-11-07 17:42 1411注意使用lucene的版本,调试本例的时候,作者使用的是luc ... -
Lucene 中文引擎,庖丁解牛的辞典参数配置方法
2009-11-07 16:34 1976随机文档指示可以在环境变量里配置。原文如下 庖丁中文分词需要一 ... -
Lucene 2.4更新索引的方法(Update Index)
2009-11-07 16:32 2025在Lucene里面没有update方法,我查了文档,我们只能删 ... -
庖丁解牛的Lucene 2.4的全文搜索代码
2009-11-07 16:30 1372package com.laozizhu.article.ut ... -
Lucene 搜索方式
2009-11-07 16:23 1122Lucene有多种搜索方式, ... -
转一篇lucene的使用的文章,写的比较全
2009-11-07 16:20 9211 lucene简介 1.1 什么是lucene Lucene ...
相关推荐
类主要是符合本人项目的需求,内容摘要的高亮点实现没这么复杂,此类中不仅仅包含了内容的高亮点实现,还包含了获取xml内容和html纯文本的提取。注意一点的是在对内容进行高亮度化的过程中,其实也就是进行全文检索的...
java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交...
Lucene实现全文检索
Lucene 实现的 搜索引擎 例子 ,里面有索引的生成 检查 等等
使用compass+lucene实现简单的全文检索功能
这是lucene的使用案例,实现了对word文档中的关键字检索,并将检索出的内容高亮打印出来
布尔操作符 域搜索 通配符搜索 模糊查询 范围搜索
用lucene实现的搜索引擎,支持中文、英文、日文、俄文、德文5种语言的搜索!
在lucene中使用庖丁解牛的分词器,实现类似当当网站的功能实现一个对企业内部产品的检索功能
使用compass+lucene实现简单的全文检索功能
为了快速查询,加快查询速度,减少与数据库交互,经常需要用到lucene实现创建索引和查询
Lucene实现索引和查询的实例讲解Lucene实现索引和查询的实例讲解
lucene实现文件检索Demo,
利用Lucene接口编写简单的信息检索系统,实现对本地目录建立索引和搜索功能。代码包含两个JSP页面,放入tomcat的webapp目录中即可在浏览器中运行程序。选择文档路径时如若涉及浏览器权限问题,可直接输入。
全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎
使用lucene技术,实现android的本地文档资源的全文检索功能,并实现关键字高亮
用java实现的,利用了lucene里面的standardAnalyzer分析器实现的分词,可以去停用词,再利用波特算法实现 词干提取 最后排序 和词频统计输出
Lucene实现全文搜索,支持英文、模糊和智能查询
实现java的网络搜索,可通过编辑实现搜索引擎的功能