【问题标题】:RavenDB modelling/indexing: address verification with reference dataRavenDB 建模/索引:使用参考数据进行地址验证
【发布时间】:2019-10-03 21:05:57
【问题描述】:

我在 Windows x64 上使用稳定的 RavenDB 4.2.3,试图通过 id 从另一个索引加载人工文档。

我正在开发一个 ETL 系统,其中很大一部分工作是地址验证。我有有效地址的参考数据,包括国家、州、邮政编码、城市/社区、街道和门牌号码范围(如果适用)以及 LAT/LON、社区类型等附加信息。 要验证的典型输入将由数万或数十万个地址记录(通常是邮政编码、社区、街道、门牌号)组成,其中大约 30% 与参考数据中的记录不匹配(当然,在标准化之后),因为拼写错误、换位等。

我假设我必须使用模糊查询逐个查询,然后使用预定义的 Levenshtein-Damerau 距离自动更正或过滤掉以进行手动更正(同时提供最佳匹配)。

但是其他 70% 左右的确实在参考数据中有直接匹配?那些我不想查询的,因为网络延迟等等,即使精确查询比模糊查询更快。我需要一个索引。

由于我无法在索引定义中查询,我的想法是从该参考数据构建一个集合,使用(标准化)地址部分的散列值来查找(减去门牌号)并将所述散列用作实体 ID 的一部分(甚至直接使用地址部分),存储规范化和规范化地址;因此我可以在要验证的地址的索引中使用此参考集合上的 LoadDocument() 来测试 100% 可验证的地址(LoadDocument() 返回非空实体并且门牌号在返回的参考地址的范围内)并过滤掉那些我必须进行较慢查询的。

考虑到要求,这听起来是一个很好的解决方案,还是我在这里遗漏了一些东西并且有更好、更 RavenDB-ish 的方式?

我认为不可能的一件事是将所述参考集合构建为 map/reduce 索引的输出,因为我无法控制 Id 生成; Id 被定义为按字段分组的散列,但我无权访问索引定义中的此散列函数以验证要验证的地址,以便将其结果用作 LoadDocument() 的文档 Id 参数。

我发现控制人工文档 ID 生成的功能存在问题,但尚未完成: https://issues.hibernatingrhinos.com/issue/RavenDB-12932

【问题讨论】:

  • 这个问题正在积极处理中,很可能会出现在 RavenDB 的下一个版本中,这会解决您的问题,不是吗?
  • 是的,当然。这是使输出集合更加有用的功能缺失的部分。再次感谢您的快速跟进。

标签: data-modeling ravendb ravendb4


【解决方案1】:

处理这种情况的最简单方法是执行以下操作: var code = sha256( (u.Zip + u.Community + u.Street + u.HouseNumber).ToLower() ); 您得到一堆记录并将它们的代码发送到数据库,然后查看您已经拥有的内容。最好分批执行此操作(调用: Load(IEnumerable ) 以避免按项目调用。 因为您有 70% / 30% 的新/现有比率,您还可以对哈希使用布隆过滤器,并且可能会节省大量数据库查询,因为您会知道该值不存在(尽管如果您找到它,您需要检查这是否是正确的)

我不确定索引/LoadDocument 与此处相关的内容。如果您需要进行更复杂的搜索,我只会走那条路。不幸的是,您可能确实需要执行以下操作:“First Av”与“1st Avenue”等,不是吗?

【讨论】:

  • 是的,布隆过滤器进一步加速;感谢您提醒我批量加载,我忽略了简单的事情。要检查的地址上的索引将具有一个布尔字段,指示参考数据中的匹配,在索引构建期间检查背景。地址部分的规范化是第一步,是的。我也期待在未来的某个 RavenDB 版本中加入更多最新的 Lucene.NET,这将有助于实现更好的模糊搜索和建议功能:github.com/apache/lucenenet/blob/master/src/Lucene.Net/Util/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多