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

lunece 用的高亮类

阅读更多

网上有很多高亮的类,但我觉得太负责了(也许他们觉得这样性能更高),我写了一个很简单采用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 = ";   
  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 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. }  
  51. 分词这边使用了一个工厂方法,用来装载词库的,返回的是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 splitStrToList(String source) {   
    77.         List ret = new ArrayList();   
    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="$1";  
    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或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖

  52.   
  53.     public HighlightProcess(String str, String key) {   
  54.         // TODO Auto-generated constructor stub   
  55.         this.str = str;   
  56.         this.key = key;   
  57.     }   
  58.   
  59.     /**  
  60.      * @return the str  
  61.      */  
  62.     public String getStr() {   
  63.         return str;   
  64.     }   
  65.   
  66.     /**  
  67.      * @param str  
  68.      *            the str to set  
  69.      */  
  70.     public void setStr(String str) {   
  71.         this.str = str;   
  72.     }   
  73.   
  74.     public String getResult() {   
  75.   
  76.         List list = WordsManager.splitStrToList(key);   
  77.         for (Iterator it = list.iterator(); it.hasNext();) {   
  78.             String target = (String) it.next();   
  79.             this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);   
  80.         }   
  81.         return this.str;   
  82.     }   
  83.   
  84. }  

分词这边使用了一个工厂方法,用来装载词库的,返回的是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 splitStrToList(String source) {   
  77.         List ret = new ArrayList();   
  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="$1";  
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或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖

分享到:
评论

相关推荐

    lunece 建立索引与查询示例

    - **IndexWriter**:用于创建和更新索引的主要类,管理写入操作。 下面是一个简单的创建索引的示例: ```java Directory indexDir = FSDirectory.open(Paths.get("index")); // 指定索引目录 Analyzer analyzer = ...

    lunece全文检索C#

    然后,我们需要引入必要的命名空间以使用Lucene.Net的相关类: ```csharp using Lucene.Net.Index; using Lucene.Net.Store; using Lucene.Net.Analysis; using Lucene.Net.Analysis.Standard; using Lucene.Net....

    lunece入门之HelloWorld

    2. 构建查询:`QueryParser`类用于构建查询。你可以指定查询字段和查询文本,它会生成一个`Query`对象。 3. 执行搜索:`IndexSearcher`的`search(Query, int)`方法执行搜索,返回一个`TopDocs`对象,其中包含了匹配...

    lunece

    【Lucene】是一个高度成熟且广泛使用的开源全文检索库,由Doug Cutting开发并最终贡献给了Apache软件基金会。作为Java语言实现的信息检索库,Lucene提供了索引和搜索功能,允许开发者将其集成到自己的应用程序中,以...

    lunece_search_3.0.zip_lunece+es

    在"Lunece_search"的压缩包文件中,很可能包含了实现上述步骤的代码示例或者教程。通过阅读和实践这些示例,我们可以更好地理解和掌握Lunecy+ES在实际项目中的应用。 总的来说,Lunecy+ES的组合为开发者提供了一套...

    lunece 学习笔记实用知识库分享知识分享

    lunece 学习笔记实用知识库分享知识分享 在本文中,我们将从多方面探索 Lucene 和 Solr 相关的知识点,并对其进行详细的分析和解释。 Lucene 和 Solr 的基本概念 Lucene 是一个基于 Java 的搜索引擎库,提供了...

    最新版linux lucene-8.5.1.tgz

    Lucene是一个高度优化的、用Java编写的搜索引擎库,它为开发人员提供了强大的文本搜索功能,使得构建高性能的全文检索应用变得简单。在这个最新的8.5.1版本中,我们可能看到一些性能提升、新特性以及错误修复。 ...

    Lucene.net高速创建索引

    描述中提到的“对SQL Server数据库表,用多线程,高速创建索引”,是指在构建Lucene.NET索引时,采用了多线程技术来提升性能。这种做法可以充分利用多核处理器的计算能力,将数据处理任务分散到多个线程中,从而加快...

    lucene-4.10.2

    开发者可以使用`IndexWriter`类来管理索引,它支持并发写入和实时搜索。此外,Lucene还引入了倒排索引,这是一种高效的存储方式,通过记录每个词项在哪些文档中出现,来实现快速的查找。 3. **查询解析与执行** ...

    Lucene检索

    在实际应用中,我们还可以扩展Lucene的功能,例如使用Filter和Collector来优化查询性能,或者实现自定义评分函数以进行更复杂的查询策略。此外,多线程索引和搜索也是大型项目中常见的需求,可以通过适当的同步机制...

    全文检索 lucene

    Lucene是用java实现的成熟的、免费的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于在Apache软件许可 [ASF, License]。同样,Lucene是当前与近几年内非常流行的免费的Java信息搜索(IR)库。

    solr的学习

    - **创建索引**:客户端(可以是浏览器或 Java 程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr 服务器根据 XML 文档添加、删除或更新索引。 - **搜索索引**:客户端用 GET 方法向 ...

    Blog-online-System:已经上线的SpringBoot博客项目

    图片使用的七牛云,属性设置在类cn.coderzhx.utils.VariableName里 如果不想用七牛云那么修改为为tomcat的upload目录 如果仅仅是本地运行项目的话,七牛云必须得有域名才行所以不能用,使用七牛云的模块就不能用了,也...

    最新.net技术博客源代码.rar

    自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎...

    Lucene常用的Demo

    4. **Lunece** 注意,这里可能是打错了,正确应该是“Lucene”。在Lucene项目中,通常会包含许多示例代码,这些代码覆盖了从基础到进阶的各种用法。通过查看这些代码,你可以学习如何使用`TokenStream`进行自定义的...

    X3BLOG 单用户版 1.0 build80707 (access)

    &lt;br&gt; 自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索...

    x3blog单用户博客程序源码-1.0.build80802-src

    自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

    x3blog 单用户博客系统 1.0.80802 源代码

    5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

    x3blog 单用户博客系统 1.0.80802 编译版

    5.自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lunece的.net版本,实现了功能强大执行快速的全文检索引擎。...

Global site tag (gtag.js) - Google Analytics