1

我在 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

4

1 回答 1

1

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

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

于 2019-10-03T13:05:57.890 回答