hexq 发表于 2006-6-7 20:58

对搜索结果里的关键字实现高亮显示~~

对搜索结果里的关键字进行高亮显示,在Lucen int action 这本书附带的源代码里包含了highlightor.jar包,但是这个包对中文支持不是很,它会把关键字所在的那句话整句高亮,于是我个人写了一个用于高亮显示关键词的类,源代码如下:我这里用的只是简单的字符串匹配,然后字符串替换,在java里还有个正则表达式,我也研究的比较深入,迟点将会用正则表达式来写这个高亮的类~~

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;

public class Highlight {
        int beginindex;

        int i;

        int a;

        int summarylength;

        String summary;

        String lightquerystring;

        String queryString;

        QueryScorer scorer;

        Query query;

        int maxNumFragments = 2;

        String separator = "...";

        // ~
        // Constructors_-------------------------------------------------------------------
        public Highlight() {

        }

        // ~ Methods
        // --------------------------------------------------------------------------------
        /**
       * method used to highlight the keyword in the summary,a simple way to do
       * highlight job
       *
       * @throws IOException
       */

        public String Highlighter(String summary, String queryString)
                        throws IOException {
                beginindex = summary.indexOf(queryString);
                summarylength = summary.length();
                lightquerystring = "<B>" + queryString + "</B>";
                if (queryString.contains(" ")) { // 有空格
                        String[] subquerystring = queryString.split(" ");
                        a = subquerystring.length;
                        beginindex = summary.indexOf(queryString);
                        for (i = 0; i < a; i++) {
                                beginindex = summary.indexOf(subquerystring);
                                System.out.println(beginindex);
                                lightquerystring = "<B>" + subquerystring + "</B>";
                                summary = summary.replace(subquerystring, lightquerystring);

                        }

                        StringReader sb = new StringReader(summary);
                        // 按行读取已经高亮的summary,
                        // 判断每行时候有关键词,有的话就添加到返回的summary
                        BufferedReader br = new BufferedReader(sb);
                        String str;
                        for (i = 0; i < a; i++) {
                                while ((str = br.readLine()) != null) {
                                        if (str.contains(subquerystring)) {
                                                summary = str + summary;
                                        }
                                }
                        }
                        return summary;
                } else if (!queryString.contains(" ")) {// 没有空格
                        if (summarylength <= 200 && summarylength >= 0) {
                                summary = summary.substring(beginindex, summarylength);
                                summary = summary.replace(queryString, lightquerystring);
                        } else if (summarylength > 200) {
                                if ((summarylength - beginindex) >= 200) {
                                        summary = summary.substring(beginindex, beginindex + 200);
                                        summary = summary.replace(queryString, lightquerystring);
                                } else if ((summarylength - beginindex) < 200) {
                                        summary = summary.substring(beginindex, summarylength);
                                        summary = summary.replace(queryString, lightquerystring);
                                }
                        }

                        return summary;
                } else {
                        return lightquerystring;
                }

        }

        /**
       * method highlighter uses Highlighter.jar to highlight the keyword in the
       * summary
       *
       */

        public String Highlighter(String summary, String queryString, Query query,
                        CJKAnalyzer analyzer, String contents) throws IOException {
                QueryScorer scorer = new QueryScorer(query);
                Highlighter highlighter = new Highlighter(scorer);
                TokenStream tokenStream = analyzer.tokenStream("contents",
                                new StringReader(summary));
                return highlighter.getBestFragments(tokenStream, summary,
                                maxNumFragments, separator);

        }
}



[ 本帖最后由 powerwind 于 2006-6-7 23:44 编辑 ]

用程序诠释生命 发表于 2006-6-7 23:59

很好,
见到有人研究搜索引擎了
支持以后多发些
怪不得Unicode那篇东西链到车东的网站

hexq 发表于 2006-6-8 00:18

呵呵,Lucene这个东西我已经研究好久了,而且也用它来开发了一个站内的搜索引擎,不过暂时我只做了对html还有text等文件格式的索引。还在写对word,pdf等格式文件的分析器。。

wool王 发表于 2006-6-8 01:08

期待楼主更多文章。luncene我只是有过了解,没深入研究过。以前做抓取系统的时候用过下,感觉很强大。

hjack 发表于 2006-6-8 10:36

期待楼主更多文章。

宿舍有个同学毕业设计就做这个,等他有空时叫他上来交流一下。。。呵呵。

hexq 发表于 2006-6-8 13:25

Hjack是计算机五班的吧,你那个同学我知道,他做那个毕业设计的时候找过我。。。我是02软件一班的

用程序诠释生命 发表于 2006-6-8 17:01

听说有些人帮人做课程设计赚钱?
有这种事?还听说很好赚滴说。

hexq 发表于 2006-6-8 17:15

有这种说法,没有去试过,也没有时间去试,自己大把事情忙

hjack 发表于 2006-6-8 20:50

hexq,你是小强呀???

顶你呀,现在才来这里。。。

hexq 发表于 2006-6-9 04:07

原帖由 hjack 于 2006-6-8 20:50 发表
hexq,你是小强呀???

顶你呀,现在才来这里。。。
呵呵 ~~正是在下啦 ~~~

wool王 发表于 2006-6-9 09:59

原帖由 用程序诠释生命 于 2006/6/8 09:01 发表
听说有些人帮人做课程设计赚钱?
有这种事?还听说很好赚滴说。

你少来这些念头。

用程序诠释生命 发表于 2006-6-9 19:10

原帖由 wool王 于 2006-6-9 09:59 发表


你少来这些念头。


唉呀。。。让你发现了。。
我正在考虑能不能去做个代做毕业设计的中介网站,
代写论文的网站早就有了,可能代做毕业设计的还没有。。

说不定到时还能上个报纸什么的,那我就出名了。
哈哈哈。。。。

wool王 发表于 2006-6-9 21:02

你做了的话别来这边做广告啊。。。封你ID。。。

Monkeylee 发表于 2006-6-9 22:09

Java...有点蒙...对我来讲...大概看懂这东东...
页: [1]
查看完整版本: 对搜索结果里的关键字实现高亮显示~~