表示位置和基于邻近度查询的有效方法?
Posted
技术标签:
【中文标题】表示位置和基于邻近度查询的有效方法?【英文标题】:Efficient way to represent locations, and query based on proximity? 【发布时间】:2013-11-15 11:50:52 【问题描述】:我正在思考如何有效地表示数据库中的位置,以便在给定任意新位置的情况下,我可以有效地在数据库中查询与对象的可接受接近度阈值内的候选位置。
之前有人问过类似的问题,但我没有找到基于我对问题域的标准的讨论。
注意事项:
从头开始,我可以用任何方式表示数据(例如 long&lat 等) 任何结果集都是时间敏感的,因为它会在很短的时间窗口(~5-15 分钟)内失去有效性,所以我不能无限期地缓存 我可以容忍结果中有一些合理的误差范围,例如,如果某个位置稍微超出阈值,或者如果结果集中的一行最近过期 语言无关的讨论是完美的,但如果它有助于我使用 C# MVC 3 和 SQL Server 2012几个初步想法:
使用像 Google 这样的外部 API,但是这会产生数千个请求并且延迟会很短 使用 Haversine 函数,但是这看起来很昂贵,因此应该在最少数量的候选者上执行(甚至可能作为存储过程!) 构建邮政编码/邮政编码图表,这样我就可以从任何节点找到与其相邻的邮政编码/邮政编码,但这可能涉及大量数据存储一些快速减少可能候选的优化思路:
缓存搜索结果集,当我们进行后续搜索时,查看主题是否在我们已经为其缓存结果集的候选者的可接受范围内。如果是这样,请使用缓存的结果集(但请记住,结果很快就会过期)我希望答案不仅仅是原始 CPU 能力,还有一些我没有想到的方法可以帮助我?
谢谢
ps。抱歉,如果我错过了以前提出的问题并提供了有用的答案,请在下方告诉我。
【问题讨论】:
好吧,SQL server 和 .NET 都有对空间数据的原生支持,为什么不使用它呢?检查例如this 或 this 有趣的链接,今晚我一定会调查的。谢谢。附言。如果它被证明是一个解决方案,您的评论可能应该是一个答案 【参考方案1】:使用 GeoHash 怎么样? (参考http://en.wikipedia.org/wiki/Geohash)
【讨论】:
这正是我希望但不知道的算法!谢谢,让我试验一下,如果它适合我的应用,我一定会接受你的回答 我正在试验 GeoHash,它肯定需要一些调整才能找到哈希精度(长度)和我的问题域要求之间的最佳点。感谢您指出我这个方向:)以上是关于表示位置和基于邻近度查询的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章
[Elasticsearch] 邻近匹配 - 性能,关联单词查询以及Shingles