1 Star 0 Fork 303

v4aoy / elasticsearch-definitive-guide-cn

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
36_Caching_geofilters.md 2.40 KB
一键复制 编辑 原始数据 按行查看 历史

缓存地理位置过滤器

因为如下两个原因,地理位置过滤器默认是不被缓存的:

  • 地理位置过滤器通常是用于查找用户当前位置附近的东西。但是用户是在移动的,并且没有两个用户的位置完全相同,因此缓存的过滤器基本不会被重复使用到。

  • 过滤器是被缓存为比特位集合来表示段(segment)内的文档。假如我们的查询排除了几乎所有文档,只剩一个保存在这个特别的段内。一个未缓存的地理位置过滤器只需要检查这一个文档就行了,但是一个缓存的地理位置过滤器则需要检查所有在段内的文档。

缓存对于地理位置过滤器也可以很有效。 假设你的索引里包含了所有美国的宾馆。一个在纽约的用户是不会对旧金山的宾馆感兴趣的。 所以我们可以认为纽约是一个_热点_(hot spot),然后画一个边框把它和附近的区域围起来。

如果这个地理盒模型过滤器geo_bounding_box)被缓存起来,那么当有位于纽约市的用户访问时它就可以被重复使用了。 它可以直接排除国内其它区域的宾馆。然后我们使用未缓存的,更加明确的地理盒模型过滤器geo_bounding_box)或者地理距离过滤器geo_distance)来在剩下的结果集中把范围进一步缩小到用户附近:


GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "geo_bounding_box": {
                "type": "indexed",
                "_cache": true, <1>
                "location": {
                  "top_left": {
                    "lat":  40,8,
                    "lon": -74.1
                  },
                  "bottom_right": {
                    "lat":  40.4,
                    "lon": -73.7
                  }
                }
              }
            },
            {
              "geo_distance": { <2>
                "distance": "1km",
                "location": {
                  "lat":  40.715,
                  "lon": -73.988
                }
              }
            }
          ]
        }
      }
    }
  }
}
  • <1> 缓存的地理盒模型过滤器把结果集缩小到了纽约市。
  • <2> 代价更高的地理距离过滤器geo_distance)让结果集缩小到1km内的用户。
Java
1
https://gitee.com/v4aoy/elasticsearch-definitive-guide-cn.git
git@gitee.com:v4aoy/elasticsearch-definitive-guide-cn.git
v4aoy
elasticsearch-definitive-guide-cn
elasticsearch-definitive-guide-cn
master

搜索帮助