使用Java搜索结果预览

时间:2011-01-21 18:15:11

标签: java search preview

假设我有以下文字(来自wiki):

  

Java是一种编程语言   最初由James Gosling开发   在Sun Microsystems(现在是   甲骨文公司的子公司)和   1995年作为核心组成部分发布   Sun Microsystems的Java平台。   这种语言的大部分来源   来自C和C ++的语法,但有一个   更简单的对象模型   低层设施。 Java的   应用程序通常编译为   可以运行的字节码(类文件)   任何Java虚拟机(JVM)   无论计算机架构如何。   Java是一个通用的,并发的,   基于阶级......

我想将“java”和“编程”匹配解析为google样式结果,如下所示:

  

Java 是一种编程语言   最初由James Gosling开发   在Sun Microsystems ... Java   应用程序通常编译为   可以运行的字节码(类文件)   任何 Java 虚拟机(JVM) ...

  1. 我可以使用哪些工具以及如何使用它们来获得上述结果。 Commons,Lucene,指南针?

  2. 如果有一个算法会突出显示关键字并注意剪切字符串并在最后添加“...”,请分享。

  3. 您如何确定在搜索结果预览中显示的关键字数量和关键字?

2 个答案:

答案 0 :(得分:1)

看看Lucene这样做,特别是看看它提供的荧光笔,这里有一个很好的例子来构建一个这样的东西:

http://www.cocooncenter.org/articles/lucene.html

答案 1 :(得分:1)

我不知道有任何工具可以帮助解决这个问题,但我可以提供一种算法,可以为您提供相当不错的结果。 *编辑:OP要求索引的示例代码。我使用Trove TIntObjectHashMap来存储此信息,但您可以使用Java HashMap执行相同操作。

步骤1:搜索每个搜索词的文本,并在文本中创建每个搜索词的偏移索引。

TIntObjectHashMap<String> matchIndex = new TIntObjectHashMap<String>();
// for each word or other string to highlight
// find each instance of each word in the string
// this is pseudocode -v
for (each instance of String searchString appearing at index int x)
  matchIndex.put(x, searchString);

步骤2:浏览步骤1中每对索引的组合,并记录索引和命中数之间的字符数。

// class to hold a match
private class Match implements Comparable {
  private int x1, x2;
  private int hitCount;

  public Match(int x1, int x2, int hitCount); // does the obvious

  private double sortValue() {
    return (double) hitCount / Math.abs(x1, x2);
  }  

  @Override
  public int compareTo(Match m) {
    double diff = this.sortValue() - m.sortValue();
    if (diff == 0.0) return 0;
    return (diff < 0.0) ? -1 : 1;
  }
}

// go through every combination of keys (string offsets) and record them
// the treeset will automatically sort the results
TreeSet<Match> matches = new TreeSet<Match>();
int[] keys = matchIndex.keys();
for (int x1 = 0; x1 < keys.length; x1++)
  for (int x2 = x1 + 1; x2 < keys.length; x2++)
    matches.put(new Match(keys[x1],
                          keys[x2] + matchIndex.get(keys[x2]).length(),
                          1 + x2 - x1));

步骤3:获取步骤2中生成的列表,并按每个字符长度的点击次数对其进行排序。

// nicely done by the TreeSet

步骤4:从步骤3中列表的顶部开始,将每个项目标记为包含在内。务必将重叠结果组合成一个更大的结果。当下一个项目将字符串的总长度超过255个(或左右)字符时停止。

步骤5:按顺序显示步骤4中的每个选定项目,并在它们之间加上“...”。请务必在每个项目中包含必要的标记,以突出显示实际的搜索词。