RavenDB modelling/indexing:使用参考数据进行地址验证
RavenDB modelling/indexing: address verification with reference data
我在 Windows x64 上使用 RavenDB 4.2.3 稳定版,试图通过另一个索引的 id 加载一个人工文档。
我正在研究 ETL 系统,其中很大一部分工作是地址验证。我有有效地址的参考数据,包括国家、州、邮政编码、city/community、街道和门牌号码范围(如适用)以及其他信息,如 LAT/LON、社区类型等。
要验证的典型输入将包含数万或数十万个地址记录(通常是邮政编码、社区、街道、门牌号),其中大约 30% 与参考数据中的记录不匹配(当然是在规范化之后),因为拼写错误、换位等
那些我假设我必须使用模糊查询一个一个地查询,然后使用预定义的 Levenshtein-Damerau 距离自动更正或过滤掉以进行手动更正(同时提供最佳匹配)。
但是 与参考数据直接匹配的其他 70% 左右呢?那些我不想查询的,因为网络延迟等等,即使精确查询比模糊查询更快。我需要一个索引。
由于我无法在索引定义中查询,我的想法是从该参考数据构建一个集合,使用(规范化的)地址部分的散列值进行查找(减去门牌号)并将所述散列用作entity Id(甚至直接使用地址部分),存储规范化和规范化的地址;因此我可以在要验证的地址的索引中在此参考集合上使用 LoadDocument() 以测试 100% 可验证地址 (LoadDocument() returns 非空实体和门牌号在返回的参考范围内地址)并过滤掉那些我必须进行较慢查询的内容。
根据要求,这听起来是个不错的解决方案,还是我遗漏了一些东西,还有更好、更像 RavenDB 的方法?
有一件事我认为是不可能的,那就是将所述参考集合构建为 map/reduce 索引的输出,因为我无法控制 Id 的生成; Id 被定义为按字段分组的散列,但我无法在要验证的地址的索引定义中访问此散列函数,以便将其结果用作 LoadDocument() 的文档 Id 参数。
我发现了控制人工文档 ID 生成的功能的问题,但尚未完成:
https://issues.hibernatingrhinos.com/issue/RavenDB-12932
最简单的处理方法是执行以下操作:
var code = sha256( (u.Zip + u.Community + u.Street + u.HouseNumber).ToLower() );
你得到一堆记录并将它们的代码发送到数据库,然后看看你已经有什么 have.It 最好分批进行(调用:Load(IEnumerable)以避免调用每个项目。
因为您有 70% / 30% 的新/现有比率,您还可以对哈希使用布隆过滤器,并且可能会节省大量数据库查询,因为您会知道该值不存在(尽管如果您找到它,您需要检查这是否正确)
我不确定索引/LoadDocument 与此处相关。如果你需要做更复杂的 searches.Unfortunately,我只会走那条路,你可能确实需要做这样的事情:"First Av" 与“第一大道”等,不是吗?
我在 Windows x64 上使用 RavenDB 4.2.3 稳定版,试图通过另一个索引的 id 加载一个人工文档。
我正在研究 ETL 系统,其中很大一部分工作是地址验证。我有有效地址的参考数据,包括国家、州、邮政编码、city/community、街道和门牌号码范围(如适用)以及其他信息,如 LAT/LON、社区类型等。 要验证的典型输入将包含数万或数十万个地址记录(通常是邮政编码、社区、街道、门牌号),其中大约 30% 与参考数据中的记录不匹配(当然是在规范化之后),因为拼写错误、换位等
那些我假设我必须使用模糊查询一个一个地查询,然后使用预定义的 Levenshtein-Damerau 距离自动更正或过滤掉以进行手动更正(同时提供最佳匹配)。
但是 与参考数据直接匹配的其他 70% 左右呢?那些我不想查询的,因为网络延迟等等,即使精确查询比模糊查询更快。我需要一个索引。
由于我无法在索引定义中查询,我的想法是从该参考数据构建一个集合,使用(规范化的)地址部分的散列值进行查找(减去门牌号)并将所述散列用作entity Id(甚至直接使用地址部分),存储规范化和规范化的地址;因此我可以在要验证的地址的索引中在此参考集合上使用 LoadDocument() 以测试 100% 可验证地址 (LoadDocument() returns 非空实体和门牌号在返回的参考范围内地址)并过滤掉那些我必须进行较慢查询的内容。
根据要求,这听起来是个不错的解决方案,还是我遗漏了一些东西,还有更好、更像 RavenDB 的方法?
有一件事我认为是不可能的,那就是将所述参考集合构建为 map/reduce 索引的输出,因为我无法控制 Id 的生成; Id 被定义为按字段分组的散列,但我无法在要验证的地址的索引定义中访问此散列函数,以便将其结果用作 LoadDocument() 的文档 Id 参数。
我发现了控制人工文档 ID 生成的功能的问题,但尚未完成: https://issues.hibernatingrhinos.com/issue/RavenDB-12932
最简单的处理方法是执行以下操作: var code = sha256( (u.Zip + u.Community + u.Street + u.HouseNumber).ToLower() ); 你得到一堆记录并将它们的代码发送到数据库,然后看看你已经有什么 have.It 最好分批进行(调用:Load(IEnumerable)以避免调用每个项目。 因为您有 70% / 30% 的新/现有比率,您还可以对哈希使用布隆过滤器,并且可能会节省大量数据库查询,因为您会知道该值不存在(尽管如果您找到它,您需要检查这是否正确)
我不确定索引/LoadDocument 与此处相关。如果你需要做更复杂的 searches.Unfortunately,我只会走那条路,你可能确实需要做这样的事情:"First Av" 与“第一大道”等,不是吗?