我正在构建一项服务,允许用户根据GPS坐标搜索附近的其他用户。我尝试过使用ElasticSearch的地理空间索引。当用户登录时,他将其GPS位置提交给ElasticSearch地理索引。其他用户定期轮询ElasticSearch,查询包含几百米内GPS坐标的新文档。
问题是ElasticSearch要么不能足够快地更新其索引,要么缓存其结果,使其不适合检索实时结果。我尝试使用index.cache.filter.max_size = -1禁用缓存,并在每次查询时传递“_cache = false”。当使用相同的查询进行轮询时,ElasticSearch仍然会返回过时的结果,并且它可以在几分钟内返回过时的结果。
对可能发生的事情有任何想法?也许是因为我在轮询期间保持相同的连接打开,并且ElasticSearch缓存每个连接的结果?不过,随后的请求结果可能会过时。
答案 0 :(得分:3)
Elasticsearch结果不会立即可用于搜索。它们在缓冲区中累积,仅在称为refresh的操作后才可用。换句话说,搜索不是实时的,而是“近实时”操作(“近”是因为默认情况下每秒调用一次刷新)。还请注意get操作是实时的 - 您可以在索引后立即获取文档。
虽然您可以在每个文档之后强制刷新过程或更频繁地进行刷新,但它不是解决您问题的最佳解决方案,因为频繁刷新会显着降低搜索和索引性能。相反,我会建议您检查Elasticsearch percolators,它们是为您的用例添加的。