多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 缓存地理位置过滤器 因为如下两个原因,地理位置过滤器默认是不被缓存的: - 地理位置过滤器通常是用于查找用户当前位置附近的东西。但是用户是在移动的,并且没有两个用户的位置完全相同,因此缓存的过滤器基本不会被重复使用到。 - 过滤器是被缓存为比特位集合来表示段([segment](dynamic-indices))内的文档。假如我们的查询排除了几乎所有文档,只剩一个保存在这个特别的段内。一个未缓存的地理位置过滤器只需要检查这一个文档就行了,但是一个缓存的地理位置过滤器则需要检查所有在段内的文档。 缓存对于地理位置过滤器也可以很有效。 假设你的索引里包含了所有美国的宾馆。一个在纽约的用户是不会对旧金山的宾馆感兴趣的。 所以我们可以认为纽约是一个_热点_(_hot spot_),然后画一个边框把它和附近的区域围起来。 如果这个`地理盒模型过滤器`(`geo_bounding_box`)被缓存起来,那么当有位于纽约市的用户访问时它就可以被重复使用了。 它可以直接排除国内其它区域的宾馆。然后我们使用未缓存的,更加明确的`地理盒模型过滤器`(`geo_bounding_box`)或者`地理距离过滤器`(`geo_distance`)来在剩下的结果集中把范围进一步缩小到用户附近: ```json 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内的用户。