我正在使用类似于Tinder的应用。在ElasticSearch中,我有大约五十万用户及其位置的集合。每当用户打开应用程序以搜索附近的用户时,我就会对该集合运行弹性搜索查询。查询相当复杂,它不仅考虑了位置,还考虑了用户的活跃程度或他拥有的照片数量。
我挣扎的是如何排除当前用户已经从查询中刷过的那些用户。实现这一点的一种天真的方法可能是维护嵌套的用户ID数组,作为索引中每个用户文档的一部分,并根据它进行排除。但是,由于每个用户都进行了数十万次扫描,因此阵列可能会变得非常大,所以它不是一个可扩展的解决方案。
有没有办法从Elastic Search查询中根据不会影响性能的ID排除大量实体?
答案 0 :(得分:11)
您可以尝试将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
}
}
]
}
}
}
}
}
答案 1 :(得分:11)
使用条款查询的查找功能:Terms lookup mechanism
当需要指定具有大量术语的术语过滤器时,从索引中的文档中获取这些术语值会很有用。一个具体的例子是过滤你的粉丝发推文的推文。可能会在术语过滤器中指定的用户ID数量很多。在这种情况下,使用术语过滤器的术语查找机制是有意义的。