深入搜索引擎原理 搜索引擎其实也是一个什么系统( 四 )

  • 同1、2的计算步骤,116.397 的最后6位编码是 “11010 01011”
  • 三、合并组码
    1. 将奇数位放经度,偶数位放纬度,把2串编码组合生成新串:“11100 11101 00100 01111”;
    2. 通过 Base32 编码,每5个二进制编码一个数,“28 29 04 15”
    3. 根据 Base32 表,得到 Geo Hash 为:“WX4G”
    即最后天安门的4位 Geo Hash 为 “WX4G”,如果需要经度更准确,在对应的经纬度编码粒度再往下追溯即可 。
    附:Base32 编码图
    深入搜索引擎原理 搜索引擎其实也是一个什么系统


    Geo Hash 如何用于地理搜索?
    举个例子,搜索天安门附近 200 米的景点,如下是天安门附近的Geo编码
    深入搜索引擎原理 搜索引擎其实也是一个什么系统


    搜索过程如下:
    1. 首先确定天安门的Geo Hash为 WX4G0B,(6位区域码约 0.34平分千米,约为长宽600米区域)
    2. 而6位编码表示 600 米,半径 300 米 > 要求的 200 米,搜索所有编码为 WX4G0B 的景点即可
    3. 但是由于天安门处于 WX4G0B 的边缘位置,并不一定处在正中心 。这就需要将 WX4G0B 附近的8个区域同时纳入搜索,故搜索 WX4G0B、WX4G09、WX4G0C 一共9个编码的景点
    4. 第3步已经将范围缩小到很小的一个区间,但是得到的景点距离并不是准确的,需要在通过距离计算过滤出小于 200 米的景点,得到最终结果 。
    由上面步骤可以看出,Geo Hash 将原本大量的距离计算,变成一个字符串检索缩小范围后,再进行小范围的距离计算,及快速又准确的进行距离搜索 。
    Geo Hash 依据的数学原理
    深入搜索引擎原理 搜索引擎其实也是一个什么系统


    如图所示,我们将二进制编码的结果填写到空间中,当将空间划分为四块时候,编码的顺序分别是左下角00,左上角01,右下脚10,右上角11,也就是类似于Z的曲线 。当我们递归的将各个块分解成更小的子块时,编码的顺序是自相似的(分形),每一个子快也形成Z曲线,这种类型的曲线被称为Peano空间填充曲线 。
    这种类型的空间填充曲线的优点是将二维空间转换成一维曲线(事实上是分形维),对大部分而言,编码相似的距离也相近,但Peano空间填充曲线最大的缺点就是突变性,有些编码相邻但距离却相差很远,比如0111与1000,编码是相邻的,但距离相差很大 。
    深入搜索引擎原理 搜索引擎其实也是一个什么系统


    除Peano空间填充曲线外,还有很多空间填充曲线,如图所示,其中效果公认较好是Hilbert空间填充曲线,相较于Peano曲线而言,Hilbert曲线没有较大的突变 。为什么GeoHash不选择Hilbert空间填充曲线呢?可能是Peano曲线思路以及计算上比较简单吧,事实上,Peano曲线就是一种四叉树线性编码方式 。
    Part 5、数值索引Lucene的倒排索引决定,索引内容是一个可排序的字符串,如果要查找一个数字,那么也需要将数字转成字符串 。这样,检索一个数字是没问题的,如果需要搜索一个数值范围,怎么做呢?
    要做范围查找,那么要求数字转成的字符串也是有序并单调的,但数字本身的位数是不一样的,最简单的版本就是前缀补0,比如 35, 234, 1 都补成 4 位,得到 0035, 0234, 0001,这样能保证:
    数字(a) > 数字(b) ===> 字符串(a) > 字符串(b)这时候,查询应该用范围内的所有数值或查询,比如查询 [33, 36) 这个范围,对应的查询语法是:
    33 || 34 || 35嗯看起来很好的解决了范围查询,但是,这样存在3个问题:
    1. 补位多少合适呢?总有一个数字会超出你的补位范围

      推荐阅读