2015-10-07 81 views
8

我正在开发类似于Tinder的应用程序。在ElasticSearch中,我收集了大约50万用户及其位置)。每当用户打开应用程序搜索附近的用户时,我都会在该集合上运行弹性搜索查询。查询相当复杂,它不仅考虑位置,还考虑了用户的活跃程度或他拥有多少照片。如何从弹性搜索查询中排除大量ID

我所苦恼的是如何排除当前用户已经从查询中滑过的用户。实现这一点的一种天真的方式可能是维护嵌套的用户ID数组作为索引中的每个用户文档的一部分,并基于此排除。但是,由于每个用户都会花费数十万次,因此这个阵列可能会超级大,所以它不是一个可扩展的解决方案。

有没有一种方法可以根据弹性搜索查询中的大量实体排除不会影响性能的ID?

回答

9

使用条款查询的查找功能:Terms lookup mechanism

当指定了很多方面的条件过滤器可以是有益的,在从文档获取那些长期价值真实需要指数。一个具体的例子就是过滤你的关注者推文推文。术语过滤器中指定的用户标识可能会很多。在这种情况下,使用术语过滤器的术语查找机制是有意义的。

+0

哇,这看起来不错,谢谢! –

+0

工程就像一个魅力!所以这两个答案都能够充分解决我的问题,但我选择这个答案作为正确的答案,因为它是一个更优雅的解决方案。非常感谢 –

+1

为了未来人们的利益,很高兴看到解决方案在工作,它实现了术语查找机制。 – Val

9

您可以尝试将ids filter添加到复杂查询的bool/must_not子句中,并查看其行为。

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
       ...    <--- your other "must" constraints 
      ], 
      "must_not": [ 
      { 
       "ids": { 
       "values": [ "id1", "id2", "id3" ] <--- your list of ids to exclude 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}