我正在开发一个具有搜索功能的Java应用程序。现在,对于搜索,我使用的是外卡搜索。因此,如果有人搜索"Hello“,他们也会得到工具包、地狱、hello等的结果。搜索之后,我会根据他们的点击量为结果分配分数,但如何比较结果,得出结果是100%匹配或80%匹配,例如"Hello Kit",几乎与"hello Kitty”匹配。有办法这样做吗?
搜索代码:
Directory directory = FSDirectory.open(path);
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
Query query = new WildcardQuery(new Term("contents", "*" + str + "*"));
TopDocs topDocs = indexSearcher.search(query, 1000);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document document = indexSearcher.doc(scoreDoc.doc);
IndexableField value = document.getField("score");
if (value != null) {
sortedMap.put(Integer.valueOf(document.get("id")), (Integer) value.numericValue());
} else {
sortedMap.put(Integer.valueOf(document.get("id")), 0);
}
}
indexSearcher.getIndexReader().close();
directory.close();谢谢。
发布于 2017-11-01 12:24:21
听起来你在找戴斯的系数。下面是一个java实现:
public static double diceCoefficient(String s1, String s2)
{
Set<String> nx = new HashSet<String>();
Set<String> ny = new HashSet<String>();
for (int i=0; i < s1.length()-1; i++) {
char x1 = s1.charAt(i);
char x2 = s1.charAt(i+1);
String tmp = "" + x1 + x2;
nx.add(tmp);
}
for (int j=0; j < s2.length()-1; j++) {
char y1 = s2.charAt(j);
char y2 = s2.charAt(j+1);
String tmp = "" + y1 + y2;
ny.add(tmp);
}
Set<String> intersection = new HashSet<String>(nx);
intersection.retainAll(ny);
double totcombigrams = intersection.size();
return (2*totcombigrams) / (nx.size()+ny.size());
}该算法为一对字符串分配一个从0到1的数字,该数字越高,它们就越相似。所以基本上就是你想要的。
https://stackoverflow.com/questions/47054553
复制相似问题