- 缓存地理位置过滤器
缓存地理位置过滤器
因为如下两个原因,地理位置过滤器默认是不被缓存的:
地理位置过滤器通常是用于查找用户当前位置附近的东西。但是用户是在移动的,并且没有两个用户的位置完全相同,因此缓存的过滤器基本不会被重复使用到。
过滤器是被缓存为比特位集合来表示段(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内的用户。
