工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4041|回复: 13

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

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

  1. import java.io.IOException;
  2. import java.io.StringReader;

  3. import org.apache.lucene.analysis.TokenStream;
  4. import org.apache.lucene.analysis.cjk.CJKAnalyzer;
  5. import org.apache.lucene.search.Query;
  6. import org.apache.lucene.search.highlight.Highlighter;
  7. import org.apache.lucene.search.highlight.QueryScorer;

  8. public class Highlight {
  9.         int beginindex;

  10.         int i;

  11.         int a;

  12.         int summarylength;

  13.         String summary;

  14.         String lightquerystring;

  15.         String queryString;

  16.         QueryScorer scorer;

  17.         Query query;

  18.         int maxNumFragments = 2;

  19.         String separator = "...";

  20.         // ~
  21.         // Constructors_-------------------------------------------------------------------
  22.         public Highlight() {

  23.         }

  24.         // ~ Methods
  25.         // --------------------------------------------------------------------------------
  26.         /**
  27.          * method used to highlight the keyword in the summary,a simple way to do
  28.          * highlight job
  29.          *
  30.          * @throws IOException
  31.          */

  32.         public String Highlighter(String summary, String queryString)
  33.                         throws IOException {
  34.                 beginindex = summary.indexOf(queryString);
  35.                 summarylength = summary.length();
  36.                 lightquerystring = "<B>" + queryString + "</B>";
  37.                 if (queryString.contains(" ")) { // 有空格
  38.                         String[] subquerystring = queryString.split(" ");
  39.                         a = subquerystring.length;
  40.                         beginindex = summary.indexOf(queryString);
  41.                         for (i = 0; i < a; i++) {
  42.                                 beginindex = summary.indexOf(subquerystring[i]);
  43.                                 System.out.println(beginindex);
  44.                                 lightquerystring = "<B>" + subquerystring[i] + "</B>";
  45.                                 summary = summary.replace(subquerystring[i], lightquerystring);

  46.                         }

  47.                         StringReader sb = new StringReader(summary);
  48.                         // 按行读取已经高亮的summary,
  49.                         // 判断每行时候有关键词,有的话就添加到返回的summary
  50.                         BufferedReader br = new BufferedReader(sb);
  51.                         String str;
  52.                         for (i = 0; i < a; i++) {
  53.                                 while ((str = br.readLine()) != null) {
  54.                                         if (str.contains(subquerystring[i])) {
  55.                                                 summary = str + summary;
  56.                                         }
  57.                                 }
  58.                         }
  59.                         return summary;
  60.                 } else if (!queryString.contains(" ")) {// 没有空格
  61.                         if (summarylength <= 200 && summarylength >= 0) {
  62.                                 summary = summary.substring(beginindex, summarylength);
  63.                                 summary = summary.replace(queryString, lightquerystring);
  64.                         } else if (summarylength > 200) {
  65.                                 if ((summarylength - beginindex) >= 200) {
  66.                                         summary = summary.substring(beginindex, beginindex + 200);
  67.                                         summary = summary.replace(queryString, lightquerystring);
  68.                                 } else if ((summarylength - beginindex) < 200) {
  69.                                         summary = summary.substring(beginindex, summarylength);
  70.                                         summary = summary.replace(queryString, lightquerystring);
  71.                                 }
  72.                         }

  73.                         return summary;
  74.                 } else {
  75.                         return lightquerystring;
  76.                 }

  77.         }

  78.         /**
  79.          * method highlighter uses Highlighter.jar to highlight the keyword in the
  80.          * summary
  81.          *
  82.          */

  83.         public String Highlighter(String summary, String queryString, Query query,
  84.                         CJKAnalyzer analyzer, String contents) throws IOException {
  85.                 QueryScorer scorer = new QueryScorer(query);
  86.                 Highlighter highlighter = new Highlighter(scorer);
  87.                 TokenStream tokenStream = analyzer.tokenStream("contents",
  88.                                 new StringReader(summary));
  89.                 return highlighter.getBestFragments(tokenStream, summary,
  90.                                 maxNumFragments, separator);

  91.         }
  92. }

复制代码

[ 本帖最后由 powerwind 于 2006-6-7 23:44 编辑 ]
发表于 2006-6-7 23:59 | 显示全部楼层
很好,
见到有人研究搜索引擎了
支持以后多发些
怪不得Unicode那篇东西链到车东的网站
回复

使用道具 举报

 楼主| 发表于 2006-6-8 00:18 | 显示全部楼层
呵呵,Lucene这个东西我已经研究好久了,而且也用它来开发了一个站内的搜索引擎,不过暂时我只做了对html还有text等文件格式的索引。还在写对word,pdf等格式文件的分析器。。
回复

使用道具 举报

发表于 2006-6-8 01:08 | 显示全部楼层
期待楼主更多文章。luncene我只是有过了解,没深入研究过。以前做抓取系统的时候用过下,感觉很强大。
回复

使用道具 举报

发表于 2006-6-8 10:36 | 显示全部楼层
期待楼主更多文章。

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

使用道具 举报

 楼主| 发表于 2006-6-8 13:25 | 显示全部楼层
Hjack是计算机五班的吧,你那个同学我知道,他做那个毕业设计的时候找过我。。。我是02软件一班的
回复

使用道具 举报

发表于 2006-6-8 17:01 | 显示全部楼层
听说有些人帮人做课程设计赚钱?
有这种事?还听说很好赚滴说。
回复

使用道具 举报

 楼主| 发表于 2006-6-8 17:15 | 显示全部楼层
有这种说法,没有去试过,也没有时间去试,自己大把事情忙
回复

使用道具 举报

发表于 2006-6-8 20:50 | 显示全部楼层
hexq,你是小强呀???

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

使用道具 举报

 楼主| 发表于 2006-6-9 04:07 | 显示全部楼层
原帖由 hjack 于 2006-6-8 20:50 发表
hexq,你是小强呀???

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

呵呵 ~~正是在下啦 ~~~
回复

使用道具 举报

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


你少来这些念头。
回复

使用道具 举报

发表于 2006-6-9 19:10 | 显示全部楼层
原帖由 wool王 于 2006-6-9 09:59 发表


你少来这些念头。



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

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

使用道具 举报

发表于 2006-6-9 21:02 | 显示全部楼层
你做了的话别来这边做广告啊。。。封你ID。。。
回复

使用道具 举报

发表于 2006-6-9 22:09 | 显示全部楼层
Java...有点蒙...对我来讲...大概看懂这东东...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-4-30 21:53

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表