2007-08-10
自己写的lucene的高亮类
网上有很多高亮的类,但我觉得太负责了(也许他们觉得这样性能更高),我写了一个很简单采用je分词+正则解决高亮问题,实际使用下来还是不错的:
java 代码
- import java.util.Iterator;
- import java.util.List;
- /**
- * @author edwardpro
- *
- */
- public class HighlightProcess {
- /**
- *
- */
- private String str;
- private String key;
- private static final String HIGH_LIGHT = "<span class=\"red\">$1</span>";
- public HighlightProcess(String str, String key) {
- // TODO Auto-generated constructor stub
- this.str = str;
- this.key = key;
- }
- /**
- * @return the str
- */
- public String getStr() {
- return str;
- }
- /**
- * @param str
- * the str to set
- */
- public void setStr(String str) {
- this.str = str;
- }
- public String getResult() {
- List<String> list = WordsManager.splitStrToList(key);
- for (Iterator it = list.iterator(); it.hasNext();) {
- String target = (String) it.next();
- this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);
- }
- return this.str;
- }
- }
分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:
java 代码
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.StringTokenizer;
- import jeasy.analysis.MMAnalyzer;
- import org.apache.log4j.Logger;
- public class WordsManager {
- private static final Logger logger = Logger.getLogger(WordsManager.class);
- private static MMAnalyzer mmanalyzer;
- private static final String DEF_SPT = "<>";
- static {
- init();
- }
- private static void init() {
- reload();
- mmanalyzer = new MMAnalyzer();
- }
- public static void reload() {
- if (AppInit.getScb().getExtDic() != null
- && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {
- File dir = new File(AppInit.getScb().getExtDic());
- File[] dics = dir.listFiles();
- // add dict file
- for (int i = 0; i < dics.length; i++) {
- try {
- MMAnalyzer.addDictionary(new FileReader(dics[i]));
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- logger.error("Read File Error", e);
- }
- }
- }
- }
- /**
- * @return the mmanalyzer
- */
- public static MMAnalyzer getMmanalyzer() {
- return mmanalyzer;
- }
- /**
- * @param mmanalyzer
- * the mmanalyzer to set
- */
- public static void setMmanalyzer(MMAnalyzer mmanalyzer) {
- WordsManager.mmanalyzer = mmanalyzer;
- }
- public static String[] splitStrToArray(String source) {
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- String[] ts = target.split(DEF_SPT);
- return ts;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static List<String> splitStrToList(String source) {
- List<String> ret = new ArrayList<String>();
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- StringTokenizer st = new StringTokenizer(target, DEF_SPT);
- for (; st.hasMoreTokens();) {
- ret.add(st.nextToken());
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- logger.error("segment error", e);
- }
- return ret;
- }
- public static void removeTag(String content) {
- MMAnalyzer.removeWord(content);
- }
- }
正则方法:
java 代码
- String reg="<span class='red'>$1</span>";
- public static String regxReplace(String str, String key, String rep) {
- Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);
- Matcher m = p.matcher(str);
- return m.replaceAll(rep);
- }
原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖
评论
gw_noah
2008-01-08
[/u][/color][color=orange][/color][color=red][color=greens][/color]










[u]
引用
[b][/b][i][/i]发表评论
- 浏览: 43909 次
- 性别:


- 详细资料
搜索本博客
最新评论
-
webflow 还是不错的
你好,我也正在顶着压力摸索WEBFLOW~.~ 你能忙我解释下几个问题吗? 希 ...
-- by caixicai -
从阿里巴巴的职位看到
现在很看好 web应用安全工程师 无奈,能力,是个问题,加紧学习,是目前的 ...
-- by guojingxf -
lucene的前端集群思路
最近做收索看了看lucene的源码,觉得很不好啊,首先说来不支持中文字典的分词, ...
-- by yuling1217 -
lucene的前端集群思路
将索引分类,然后分放到不同的机器上,是不是也可以达到同样的效果。
-- by johnnyhg -
lucene的前端集群思路
你的方案还是有道理的,不过nfs的速度和可靠性也要评估。索引太大了,使用RAMD ...
-- by grantbb






评论排行榜