[英]Fuzzy Queries in Lucene
我在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.*;
有谁知道为什么它无法访问或我在做什么错? 对问题的长度表示歉意。
您不需要Lucene即可获得分数。 看一下Simmetrics库 ,它使用起来非常简单。 只需添加罐子并按以下方式使用它:
Levenstein ld = new Levenstein ();
float sim = ld.GetSimilarity(string1, string2);
还要注意,根据数据类型(例如,更长的字符串,#空格等),您可能希望查看其他算法,例如Jaro-Winkler,Smith-Waterman等。
您可以使用上面的方法确定将模糊重复的字符串折叠为一个“主”字符串,然后进行索引。
您可以通过以下方式获取匹配值:
TopDocs topDocs = collector.topDocs();
for(ScoreDoc scoreDoc : topDocs.scoreDocs) {
System.out.println(scoreDoc.score);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.