我在JAVA中使用Lucene,并根据公司名称索引数据库中的表。索引之后我想对我们希望输入数据库的值进行模糊匹配(Levenshtein距离)。原因是由于拼写错误,我们不想进入欺骗。
例如,如果我有公司名称“Widget Makers XYZ”,我不想插入“Widget Maker XYZ”。
从我读过的Lucene的模糊匹配算法应该给我一个介于0和1之间的数字,我想做一些测试,然后确定并为我们确定有效或无效的值。
问题是我被困住了,在搜索了互联网上似乎无处不在的地方后,需要StackOverflow社区的帮助。
就像我说过我已经在公司名称上索引数据库,然后有以下代码:
IndexSearcher searcher = new IndexSearcher(directory);
new QueryParser(Version.LUCENE_30, "company", analyzer);
Query fuzzy_query = new FuzzyQuery(new Term("company", "Center"));
我之后遇到问题,基本上我不知道如何获得模糊匹配值。我知道代码必须看起来像下面这样,但是没有收藏家似乎符合我的需要。 (正如你现在所看到的,我只能计算比赛次数,对我来说没用)
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(fuzzy_query, collector);
System.out.println("\ncollector.getTotalHits() = " + collector.getTotalHits());
此外,我无法使用Lucene文档中显示的ComplexPhraseQueryParser类。我在做:
import org.apache.lucene.queryParser.*;
有没有人知道为什么它无法访问或我做错了什么?对问题的长度道歉。
答案 0 :(得分:1)
你不需要Lucene来获得分数。看看Simmetrics library,它非常简单易用。只需添加jar并使用它:
Levenstein ld = new Levenstein ();
float sim = ld.GetSimilarity(string1, string2);
另外请注意,根据数据类型(即较长的字符串,#空格等),您可能需要查看其他算法,例如Jaro-Winkler,Smith-Waterman等。
您可以使用上述方法确定将模糊重复字符串折叠为一个“主”字符串然后编制索引。
答案 1 :(得分:0)
您可以通过以下方式获取匹配值:
TopDocs topDocs = collector.topDocs();
for(ScoreDoc scoreDoc : topDocs.scoreDocs) {
System.out.println(scoreDoc.score);
}