我有一个关于 Lucene/Solr 的问题。
我正在尝试解决一般(公司)名称匹配问题。
让我举一个过于简单的例子:
我们有两个(可能很大)名称列表,即 list_A 和 list_B。我们想找到两个列表的交集,但两个列表中的名称可能并不总是完全匹配。对于 list_A 中的每个不同名称,我们将希望从 list_B 报告一个或多个最佳匹配。
听说Lucene/Solr可以解决这个问题。你能告诉我这是不是真的?如果是,请指出一些最小的工作示例。
谢谢和问候, Dibyendu
我有一个关于 Lucene/Solr 的问题。
我正在尝试解决一般(公司)名称匹配问题。
让我举一个过于简单的例子:
我们有两个(可能很大)名称列表,即 list_A 和 list_B。我们想找到两个列表的交集,但两个列表中的名称可能并不总是完全匹配。对于 list_A 中的每个不同名称,我们将希望从 list_B 报告一个或多个最佳匹配。
听说Lucene/Solr可以解决这个问题。你能告诉我这是不是真的?如果是,请指出一些最小的工作示例。
谢谢和问候, Dibyendu
你可以用 Lucene 解决这个问题,是的,但是如果你只需要解决这个问题,那么创建一个 Lucene 索引将是一种迂回的方法。
我更倾向于采取更简单的方法。您可以找到一个用于字符串之间模糊比较的库,并遍历您的列表并仅返回低于某个相似性阈值的那些作为匹配项。
org.apache.commons.lang3.StringUtils 浮现在脑海中,类似于:
for (String a : alist) {
for (String b : blist) {
int dist = StringUtils.getLevenshteinDistance(a,b)
if (dist < threshold) {
//b is a good enough match for a, do something with it!
}
}
}
SOLR 可以解决您的问题。在 SOLR 中索引 list_B。现在在 SOLR 中搜索 list_A 中的每个项目,您将从 list_B 中获得一个或多个可能的匹配项。您需要根据您的数据集以及您想要什么样的类似结果为该字段配置分析器和过滤器。
我正在尝试做类似的事情,我想向其他评论者指出,如果问题是匹配准确的名称,而不是拼写错误,他们提出的解决方案(如 Levenshtein Distance 或 Soundex)可能不合适名字。
例如:我怀疑任何一个都可以用于匹配
John S W Edward
和
J Samuel Woodhouse Edward
我想这是可能的,但这与他们打算完成的问题不同。