首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene中的模糊查询

Lucene中的模糊查询
EN

Stack Overflow用户
提问于 2010-07-29 07:10:32
回答 2查看 3.4K关注 0票数 1

我在JAVA中使用Lucene,并根据公司名称在我们的数据库中索引一个表。在索引之后,我希望对我们希望输入到数据库中的值进行模糊匹配(Levenshtein距离)。原因是我们不想因为拼写错误而输入被骗的内容。

例如,如果我的公司名称是"Widget Maker XYZ“,我不想插入"Widget Maker XYZ”。

根据我所读到的,Lucene的模糊匹配算法应该给我一个介于0和1之间的数字,我想做一些测试,然后确定足够的值来确定什么是有效的,什么是无效的。

问题是我被困住了,在互联网上搜索了似乎无处不在的东西后,我需要StackOverflow社区的帮助。

正如我所说的,我已经在公司名称上为数据库建立了索引,然后具有以下代码:

代码语言:javascript
复制
IndexSearcher searcher = new IndexSearcher(directory);  

new QueryParser(Version.LUCENE_30, "company", analyzer);

Query fuzzy_query = new FuzzyQuery(new Term("company", "Center"));

后来我遇到了这个问题,基本上我不知道如何获得模糊匹配值。我知道代码一定看起来像下面这样,但是似乎没有一个收集器能满足我的需求。(正如您现在看到的,我只能计算匹配的数量,这对我来说是无用的)

代码语言:javascript
复制
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);

searcher.search(fuzzy_query, collector);

System.out.println("\ncollector.getTotalHits() = " + collector.getTotalHits());

此外,我无法使用Lucene文档中显示的ComplexPhraseQueryParser类。我正在做:

代码语言:javascript
复制
import org.apache.lucene.queryParser.*;

有没有人知道为什么它无法访问或者我做错了什么?很抱歉问题太长了。

EN

回答 2

Stack Overflow用户

发布于 2010-07-29 21:18:08

您不需要Lucene来获得分数。看看Simmetrics library,它的使用非常简单。只需添加jar并按如下方式使用它:

代码语言:javascript
复制
Levenstein ld = new Levenstein ();
float sim = ld.GetSimilarity(string1, string2);

还要注意,根据数据的类型(即较长的字符串、#空格等),您可能希望查看其他算法,如Jaro-Winkler、Smith-Waterman等。

您可以使用上面的公式来确定将模糊重复字符串折叠为一个“主”字符串,然后对其进行索引。

票数 1
EN

Stack Overflow用户

发布于 2010-07-29 08:11:57

您可以使用以下命令获取匹配值:

代码语言:javascript
复制
TopDocs topDocs = collector.topDocs();
for(ScoreDoc scoreDoc : topDocs.scoreDocs) {
    System.out.println(scoreDoc.score);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3358270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档