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

自己写的lucene的高亮类

阅读更多

网上有很多高亮的类,但我觉得太负责了(也许他们觉得这样性能更高),我写了一个很简单采用je分词+正则解决高亮问题,实际使用下来还是不错的:

java 代码
  1. import java.util.Iterator;   
  2. import java.util.List;   
  3.   
  4. /**  
  5.  * @author edwardpro  
  6.  *   
  7.  */  
  8. public class HighlightProcess {   
  9.   
  10.     /**  
  11.      *   
  12.      */  
  13.     private String str;   
  14.   
  15.     private String key;   
  16.   
  17.     private static final String HIGH_LIGHT = "<span class=\"red\">$1</span>";   
  18.   
  19.     public HighlightProcess(String str, String key) {   
  20.         // TODO Auto-generated constructor stub   
  21.         this.str = str;   
  22.         this.key = key;   
  23.     }   
  24.   
  25.     /**  
  26.      * @return the str  
  27.      */  
  28.     public String getStr() {   
  29.         return str;   
  30.     }   
  31.   
  32.     /**  
  33.      * @param str  
  34.      *            the str to set  
  35.      */  
  36.     public void setStr(String str) {   
  37.         this.str = str;   
  38.     }   
  39.   
  40.     public String getResult() {   
  41.   
  42.         List<String> list = WordsManager.splitStrToList(key);   
  43.         for (Iterator it = list.iterator(); it.hasNext();) {   
  44.             String target = (String) it.next();   
  45.             this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);   
  46.         }   
  47.         return this.str;   
  48.     }   
  49.   
  50. }  

分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:

java 代码
  1. import java.io.File;   
  2. import java.io.FileNotFoundException;   
  3. import java.io.FileReader;   
  4. import java.io.IOException;   
  5. import java.util.ArrayList;   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8. import java.util.StringTokenizer;   
  9.   
  10. import jeasy.analysis.MMAnalyzer;   
  11.   
  12. import org.apache.log4j.Logger;   
  13.   
  14.   
  15. public class WordsManager {   
  16.   
  17.     private static final Logger logger = Logger.getLogger(WordsManager.class);   
  18.   
  19.     private static MMAnalyzer mmanalyzer;   
  20.   
  21.     private static final String DEF_SPT = "<>";   
  22.   
  23.     static {   
  24.         init();   
  25.     }   
  26.   
  27.     private static void init() {   
  28.         reload();   
  29.         mmanalyzer = new MMAnalyzer();   
  30.     }   
  31.   
  32.     public static void reload() {   
  33.         if (AppInit.getScb().getExtDic() != null  
  34.                 && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {   
  35.             File dir = new File(AppInit.getScb().getExtDic());   
  36.             File[] dics = dir.listFiles();   
  37.             // add dict file   
  38.             for (int i = 0; i < dics.length; i++) {   
  39.                 try {   
  40.                     MMAnalyzer.addDictionary(new FileReader(dics[i]));   
  41.                 } catch (FileNotFoundException e) {   
  42.                     // TODO Auto-generated catch block   
  43.                     logger.error("Read File Error", e);   
  44.                 }   
  45.             }   
  46.         }   
  47.     }   
  48.   
  49.     /**  
  50.      * @return the mmanalyzer  
  51.      */  
  52.     public static MMAnalyzer getMmanalyzer() {   
  53.         return mmanalyzer;   
  54.     }   
  55.   
  56.     /**  
  57.      * @param mmanalyzer  
  58.      *            the mmanalyzer to set  
  59.      */  
  60.     public static void setMmanalyzer(MMAnalyzer mmanalyzer) {   
  61.         WordsManager.mmanalyzer = mmanalyzer;   
  62.     }   
  63.   
  64.     public static String[] splitStrToArray(String source) {   
  65.         try {   
  66.             String target = mmanalyzer.segment(source, DEF_SPT);   
  67.             String[] ts = target.split(DEF_SPT);   
  68.             return ts;   
  69.         } catch (IOException e) {   
  70.             // TODO Auto-generated catch block   
  71.             e.printStackTrace();   
  72.         }   
  73.         return null;   
  74.     }   
  75.   
  76.     public static List<String> splitStrToList(String source) {   
  77.         List<String> ret = new ArrayList<String>();   
  78.         try {   
  79.             String target = mmanalyzer.segment(source, DEF_SPT);   
  80.             StringTokenizer st = new StringTokenizer(target, DEF_SPT);   
  81.             for (; st.hasMoreTokens();) {   
  82.                 ret.add(st.nextToken());   
  83.             }   
  84.         } catch (IOException e) {   
  85.             // TODO Auto-generated catch block   
  86.             logger.error("segment error", e);   
  87.         }   
  88.         return ret;   
  89.   
  90.     }   
  91.   
  92.     public static void removeTag(String content) {   
  93.         MMAnalyzer.removeWord(content);   
  94.     }   
  95. }   

正则方法:

java 代码
  1. String reg="<span class='red'>$1</span>";  
java 代码
  1. public static String regxReplace(String str, String key, String rep) {   
  2.     Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);   
  3.     Matcher m = p.matcher(str);   
  4.     return m.replaceAll(rep);   
  5. }  

原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖

分享到:
评论
1 楼 gw_noah 2008-01-08  
[/u][/color][color=orange][/color][color=red][color=greens][/color]            [u]
引用
[b][/b][i][/i]
[img][/img][url][/url][align=left][/align][size=xx-small][/size]

相关推荐

    lucene 高亮显示. java

    通过上述方法,不仅能够保持Lucene高亮显示功能的准确性,还能在处理中文分词时显著提升系统性能,特别是对于大数据量和高并发场景下的应用,这种优化显得尤为重要。Lucene的TermVector特性,配合合理的代码实现,为...

    lucene3.5高亮jar

    lucene3.5高亮

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

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

    lucene高亮显示

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

    自己写的lucene分页高亮显示代码

    Lucene 提供了 `Highlighter` 工具类,用于高亮显示搜索结果中的匹配部分。以下步骤展示了如何使用高亮功能: 1. 创建一个 `Analyzer` 对象,用于分析文本。 2. 使用 `QueryParser` 解析查询字符串,得到 `Query` ...

    lucene-highlighter-3.5.0.jar lucene高亮包

    lucene-highlighter-3.5.0.jar lucene高亮包

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

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

    Lucene+HighLighter高亮显示实例

    总之,Lucene+HighLighter的组合提供了强大的搜索和高亮功能,通过理解其工作原理和配置细节,开发者可以在自己的应用中实现高效的全文搜索并呈现美观的高亮结果。无论是简单的个人项目还是大型企业级应用,Lucene都...

    lucene.net以及高亮的DLL文件

    2. **Highlighter类**:通常,高亮器类会接受搜索查询和文档内容作为输入,然后在文档中找到匹配的查询术语,并用特定的样式(如颜色、粗体)标出这些术语。 3. **分词器集成**:为了正确地高亮显示,高亮器需要...

    java实现lucene高亮显示Html,直接测试就可以用

    确保你的项目已经正确配置了Lucene库,并且`HighLighterUtils.java`中引用的所有类和方法都可用。 总的来说,Java和Lucene的结合为实现HTML文本的高亮显示提供了强大的工具。通过理解这个过程和`HighLighterUtils....

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

    使用Highlighter类,我们可以获取到每个匹配文档的高亮片段。首先,创建一个QueryScorer,然后使用SimpleHTMLFormatter设置高亮样式,最后通过Highlighter.getBestFragments方法获取高亮后的文本。 7. **性能优化**...

    lucene例子手写

    **Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了一个简单但功能强大的 API...通过参考这个例子,开发者可以更好地掌握 Lucene 的使用,为自己的项目构建高效的全文搜索引擎。

    lucene.NET 中文分词

    本文将深入探讨Lucene.NET如何进行中文分词以及高亮显示的实现。 ### 1. 中文分词 中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词...

    Lucene2.4.0(jar包+高亮包)

    - **搜索结果高亮**: 为了提高用户阅读体验,Lucene 高亮包提供了搜索关键词在文档中的高亮显示功能,使用户能快速识别出匹配的关键词。 - **自定义样式**: 开发者可以自定义高亮的样式,如使用不同的颜色或者背景...

    Lucene5学习之Highlighte关键字高亮

    《Lucene5学习之Highlighter关键字高亮》 在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的...

    自己写的一个lucene知识点集合

    - **高亮显示**:Highlighter 类可以将查询结果中的匹配片段高亮显示。 - **自定义分析**:可以通过继承 Analyzer 类来定制自己的分词规则。 - **近实时搜索**:IndexWriter 提供的 near-real-time (NRT) 搜索...

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

    描述中的“这是我自已写的Lucene与Mysql结合的例子”,说明作者创建了一个实际项目,将Lucene的功能与MySQL数据库存储的数据进行了集成。"只是个简单的示例"暗示这可能是初级或中级难度的教程,适合初学者或有一定...

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

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

    lucene-highlighter-2.2.0-src.zip

    《深入解析Lucene高亮显示源码:剖析`lucene-highlighter-2.2.0-src.zip`》 Lucene,作为一个开源全文检索库,以其高效、灵活的特点在信息检索领域广泛应用。在处理搜索结果时,为了提升用户体验,通常会采用高亮...

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

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

Global site tag (gtag.js) - Google Analytics