使用Java进行搜索结果预览

使用Java进行搜索结果预览,java,search,preview,Java,Search,Preview,假设我有以下文本(来自): Java是一种编程语言 最初由詹姆斯·戈斯林开发 在Sun Microsystems(现在是 甲骨文公司的子公司)和 1995年作为核心组件发布 Sun Microsystems的Java平台。 这门语言的许多特点都来源于它的语言 C和C++的语法,但有一个 更简单的对象模型和更少的 低级设施。JAVA 应用程序通常编译为 可以在上运行的字节码(类文件) 任何Java虚拟机(JVM) 不管计算机架构如何。 Java是一种通用、并发、, 基于类的 我想将“java”和“

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

Java是一种编程语言 最初由詹姆斯·戈斯林开发 在Sun Microsystems(现在是 甲骨文公司的子公司)和 1995年作为核心组件发布 Sun Microsystems的Java平台。 这门语言的许多特点都来源于它的语言 C和C++的语法,但有一个 更简单的对象模型和更少的 低级设施。JAVA 应用程序通常编译为 可以在上运行的字节码(类文件) 任何Java虚拟机(JVM) 不管计算机架构如何。 Java是一种通用、并发、, 基于类的

我想将“java”和“programming”匹配解析为谷歌风格的结果,如下所示:

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

  • 我可以使用什么工具以及如何使用它们来获得上述结果。Commons,Lucene,Compass

  • 如果有一种算法可以突出显示关键字,并注意剪切字符串并在末尾添加“…”,请分享

  • 如何决定在搜索结果预览中显示多少关键字以及哪些关键字


  • 看看Lucene如何做到这一点,特别是看看它提供的荧光灯,这里有一个很好的例子,就是建造一个这样的荧光灯:


    我不知道有什么工具能帮上忙,但我可以提供一种算法,让你得到相当不错的结果*编辑:OP询问索引的示例代码。我正在使用存储此信息,但您也可以使用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); TIntObjectHashMap matchIndex=新的TIntObjectHashMap(); //对于要突出显示的每个单词或其他字符串 //查找字符串中每个单词的每个实例 //这是伪代码-v for(索引int x处出现的字符串searchString的每个实例) 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)); //举行一场比赛 私有类匹配实现可比较{ 私有int-x1,x2; 私人整数命中率; 公共匹配(intx1,intx2,inthitcount);//明显的 私有双排序值(){ 返回(双)命中率/数学绝对值(x1,x2); } @凌驾 公共整数比较(匹配m){ double diff=this.sortValue()-m.sortValue(); if(diff==0.0)返回0; 回报率(差值<0.0)?-1:1; } } //检查每个键组合(字符串偏移)并记录它们 //树集将自动对结果进行排序 树集匹配=新树集(); int[]keys=matchIndex.keys(); 对于(int-x1=0;x1 // nicely done by the TreeSet //在树上做得很好 第4步:从第3步列表的顶部开始,将每个项目标记为已包含。确保将重叠结果合并为一个更大的结果。当下一项将字符串的总长度推到255个字符以上时停止


    步骤5:按顺序显示步骤4中的每个选定项目,并在它们之间加上“…”。请确保在每个项目中包含突出显示实际搜索词所需的任何标记。

    @slideshowp2请停止编辑简历队列中的问题!你把它们扔掉,这样其他人就不能复习了them@double-对不起,我不明白我做错了什么。我总是检查并修复语法错误。@slideshowp2请参见“关闭/重新打开投票”部分:您可以尝试通过“编辑”按钮修复可关闭的问题,该按钮将自动从列表中删除该问题queue@double-嘟嘟声对不起。我还是不明白。这是否意味着我不应该编辑关闭投票队列中的问题?我只是编辑和修正语法错误。这是一个错误的操作吗?我的理解是,编辑问题后,问题仍然在队列中,其他人可以再次查看。就像一个评论链