使用Java进行搜索结果预览
假设我有以下文本(来自): Java是一种编程语言 最初由詹姆斯·戈斯林开发 在Sun Microsystems(现在是 甲骨文公司的子公司)和 1995年作为核心组件发布 Sun Microsystems的Java平台。 这门语言的许多特点都来源于它的语言 C和C++的语法,但有一个 更简单的对象模型和更少的 低级设施。JAVA 应用程序通常编译为 可以在上运行的字节码(类文件) 任何Java虚拟机(JVM) 不管计算机架构如何。 Java是一种通用、并发、, 基于类的 我想将“java”和“programming”匹配解析为谷歌风格的结果,如下所示: Java是一种编程语言 最初由詹姆斯·戈斯林开发 在Sun Microsystems..Java上 应用程序通常编译为 可以在上运行的字节码(类文件) 任何Java虚拟机(JVM)…使用Java进行搜索结果预览,java,search,preview,Java,Search,Preview,假设我有以下文本(来自): Java是一种编程语言 最初由詹姆斯·戈斯林开发 在Sun Microsystems(现在是 甲骨文公司的子公司)和 1995年作为核心组件发布 Sun Microsystems的Java平台。 这门语言的许多特点都来源于它的语言 C和C++的语法,但有一个 更简单的对象模型和更少的 低级设施。JAVA 应用程序通常编译为 可以在上运行的字节码(类文件) 任何Java虚拟机(JVM) 不管计算机架构如何。 Java是一种通用、并发、, 基于类的 我想将“java”和“
看看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步骤5:按顺序显示步骤4中的每个选定项目,并在它们之间加上“…”。请确保在每个项目中包含突出显示实际搜索词所需的任何标记。@slideshowp2请停止编辑简历队列中的问题!你把它们扔掉,这样其他人就不能复习了them@double-对不起,我不明白我做错了什么。我总是检查并修复语法错误。@slideshowp2请参见“关闭/重新打开投票”部分:您可以尝试通过“编辑”按钮修复可关闭的问题,该按钮将自动从列表中删除该问题queue@double-嘟嘟声对不起。我还是不明白。这是否意味着我不应该编辑关闭投票队列中的问题?我只是编辑和修正语法错误。这是一个错误的操作吗?我的理解是,编辑问题后,问题仍然在队列中,其他人可以再次查看。就像一个评论链