Lucene中的模糊查询

时间:2010-07-28 23:10:32

标签: java indexing 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.*;

有没有人知道为什么它无法访问或我做错了什么?对问题的长度道歉。

2 个答案:

答案 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);
}