我在JAVA中使用Lucene,并根据公司名称在我们的数据库中索引一个表。在索引之后,我希望对我们希望输入到数据库中的值进行模糊匹配(Levenshtein距离)。原因是我们不想因为拼写错误而输入被骗的内容。
例如,如果我的公司名称是"Widget Maker 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.*;有没有人知道为什么它无法访问或者我做错了什么?很抱歉问题太长了。
发布于 2010-07-29 21:18:08
您不需要Lucene来获得分数。看看Simmetrics library,它的使用非常简单。只需添加jar并按如下方式使用它:
Levenstein ld = new Levenstein ();
float sim = ld.GetSimilarity(string1, string2);还要注意,根据数据的类型(即较长的字符串、#空格等),您可能希望查看其他算法,如Jaro-Winkler、Smith-Waterman等。
您可以使用上面的公式来确定将模糊重复字符串折叠为一个“主”字符串,然后对其进行索引。
发布于 2010-07-29 08:11:57
您可以使用以下命令获取匹配值:
TopDocs topDocs = collector.topDocs();
for(ScoreDoc scoreDoc : topDocs.scoreDocs) {
System.out.println(scoreDoc.score);
}https://stackoverflow.com/questions/3358270
复制相似问题