繁体   English   中英

Lucene中的模糊查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM