搜索有Elasticsearch的公司

时间:2019-03-24 13:30:15

标签: elasticsearch

想象一下,我有两个数据源。一个消息来源称马克斯为 A.P。 Møller-MærskA ,另一个是 A.P。 Møller-MærskA / S 。现在我有很多公司,我想简化这些公司的命名。

这两个来源都在Elasticsearch中建立了索引,但是我对于使用这种技术太过陌生,无法提出适当的搜索查询。虽然我最初使用的是common,但效果不错,但我认为还有更好的方法。

有什么建议吗?

编辑

一些澄清。我的两个来源只是提供公司名称的数据来源。我已经将这些名称存储在每个来源的索引中-文档就是名称。

因此,我有两个带有公司名称的索引(那里没有其他名称)。现在,对于索引A中的每个公司名称,我想在索引B中找到相应的公司。挑战在于,有多种方式来写公司名称-它不是标准化的。我想以尽可能少的体力劳动来创建此链接,并且将发生错误的风险降到最低。

1 个答案:

答案 0 :(得分:0)

鉴于前一个问题,OP可能已经不再关注这个问题了。并且,例如,common has now been deprecated。但是,如果有帮助,请遵循以下准则:

问题

据我从问题中了解到的,这个问题可以用以下例子来说明:我在两个不同的数据源中有两个公司名称。一个是:

A.P。莫勒-莫尔斯克A

另一个是:

A.P。莫勒-莫尔斯克A / S

假设它们代表同一家公司,问题在于如何将它们解析为单个规范名称(例如,如果在这种情况下是合适的名称,则为“Mærsk”)。

此外,我们如何才能以尽可能自动化的方式对一大批公司名称执行此匹配过程?

一个警告-通常使这些任务可重复是值得的-即使您认为这将是一次一次性的清理活动,但通常不会以这种方式结束(IMHO)。

一个解决方案

在这种情况下,通常无法获得全自动匹配解决方案-通常需要一些人工干预。但是您也许可以接近。

我将享有一些自由-例如,我将忽略“两个不同的数据源”方面。相反,我假设我们有一个整体列表,两个来源的并集(因为每个列表中可能存在 内的名称变体)。

这是在类似领域(电影片名)中对我广泛起作用的内容。

完全公开:就我而言,我没有使用ElasticSearch。我使用了Lucene和一些自定义Java。但是在这种情况下,有很多相似之处。我在下面的所有参考都涉及ElasticSearch v7.5功能。

令牌化

问题表明数据已被索引-但是使用什么标记步骤?一些建议(在OP的情况下可能已经实施):

  • 考虑留在 stop-words中。这不是一成不变的规则,但是请考虑如果停用词被删除,The The乐队会发生什么。没有什么可索引的。在名称相对较短的文本中,停用词可能太重要了,无法删除。

  • 考虑使用ascii folding等对文本进行规范化(将变音符号(例如,从é删除为e;将连字号,例如,从æ扩展为{ {1}};依此类推。这假设您使用的是Latin-based文本,与其他脚本(中文等)的相关性较低。

  • 考虑特定于您的问题域的自定义。例如,可能存在诸如“ LTD”,“ Ltd”等之类的术语变体,代表公司名称中的单词“ Limited”。或在某些示例中使用与号(&),而在其他示例中使用“与”。 “ Smith&Sons,Ltd”与“ Smith and Sons Limited”。

  • 诸如lowercase之类的其他转换和标点的删除更为简单。

支持元数据

OP可能无权使用其中任何一种方法-但是支持元数据对于确定两个名称变体是否引用同一实体至关重要。电影作品世界的一个例子:IMDb中有两部电影叫做“ Kicking and Screaming”,还有许多电视剧集。可以通过比较相关的元数据来区分它们,例如:

  • 发行类型(电影,电视剧等)
  • 首次发布的年份(可能具有+/-公差阈值)。

我不知道这对公司而言会是什么。

一种相当粗糙的技术是将此类数据附加到每个公司名称中,从而增加每个可索引术语中可用的令牌数量。

或者,可以在下游使用元数据数据来进一步验证两个术语是否匹配。

匹配和得分阈值

让我们假设我们有一个简单的单词边界索引术语(尽管还有很多其他方法-ngramsshingles等)。

现在,我们对每个公司名称进行搜索(如果添加的话,还要加上其他元数据)。

让我们假设已经定义了一个阈值分数,必须将其达到阈值分数才能将搜索结果视为匹配项。分数应易于调整以调整匹配行为。

如果我们只得到一个超过该分数的匹配项,则可以假定我们有一个自动匹配项:这两个名称代表相同的基础公司。

如果获得的零匹配项超过了该分数,那么我们可以假定公司名称在数据集中是唯一的。

如果我们有多个匹配项,则可能需要手动干预来确定名称是否相等。

测试用例

目标是最大程度地减少误判匹配,同时最大程度地减少匹配失败。

你怎么知道?

对此我唯一的好答案是生成一组测试用例。最好的方法是研究数据,这样您就可以找到合适的狡猾和欺诈性案例进行测试。

结论

这听起来像很多工作。您实际要做的是多少,或多少-严格或多么粗略-取决于您。当然,这取决于您的情况。