Data modeling RavenDB建模/索引:使用参考数据进行地址验证

Data modeling RavenDB建模/索引:使用参考数据进行地址验证,data-modeling,ravendb,ravendb4,Data Modeling,Ravendb,Ravendb4,我在Windowsx64上使用Ravendb4.2.3稳定版,试图从另一个索引中加载一个id为的人工文档 我正在开发一个ETL系统,其中一个重要部分是地址验证。我有有效地址的参考数据,包括国家、州、邮政编码、城市/社区、街道和房屋编号范围(如适用)以及其他信息,如LAT/LON、社区类型等。 要验证的典型输入将由数万或数十万个地址记录(通常是zipcode、社区、街道、门牌号)组成,其中约30%与参考数据中的记录不匹配(当然,在标准化之后),原因是拼写错误、换位等 我假设我必须使用模糊查询逐个查

我在Windowsx64上使用Ravendb4.2.3稳定版,试图从另一个索引中加载一个id为的人工文档

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

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

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

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

考虑到需求,这听起来是一个很好的解决方案,还是我在这里遗漏了一些东西,有一个更好、更像乌鸦的方法

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

我发现控制人工文档Id生成的功能存在问题,但尚未完成:
最简单的处理方法是执行以下操作: var代码=sha256((u.Zip+u.Community+u.Street+u.HouseNumber).ToLower()); 你会得到一堆记录并将它们的代码发送到数据库,然后查看你已经拥有了什么。最好是成批(调用:Load(IEnumerable))这样做,以避免对每个项目进行调用。 因为您有70%/30%的新/现有比率,所以您还可以在哈希上使用bloom筛选器,并且可能会保存大量数据库查询,因为您将知道该值不在那里(尽管如果找到它,您需要检查它是否正确)


我不确定这里的索引/加载文档是什么关系。我只会在你需要进行更复杂的搜索时才这样做。不幸的是,你可能确实需要做一些事情,比如:“第一Av”和“第一大道”,等等,否?

此问题正在积极研究中,可能会出现在RavenDB的下一个版本中,这将解决您的问题,否?是的,绝对是。这是功能缺失的一部分,它将使输出集合变得更加有用。再次感谢您的快速跟进。是的,bloom filters可进一步加速;感谢提醒在批量加载的问题上,我忽略了一件简单的事情。要检查的地址上的索引将有一个bool字段,指示参考数据中的匹配,在索引构建期间在后台检查。是的,地址部分的标准化是第一步。我还期待着在一些RavenDB版本中进一步加入更新的Lucene.NET这将有助于实现更好的模糊搜索和建议功能: