如何从弹性搜索查询中排除大量ID

Mar*_*áva 12 elasticsearch

我正在开发一个类似于Tinder的应用程序.在ElasticSearch中,我有大约五十万用户及其位置的集合.每当用户打开应用程序以搜索附近的用户时,我就会对该集合运行弹性搜索查询.查询相当复杂,它不仅考虑了位置,还考虑了用户的活跃程度或他拥有的照片数量.

我所挣扎的是如何排除当前用户已经从查询中刷过的那些用户.实现这一点的一种天真的方法可能是维护嵌套的用户ID数组,作为索引中每个用户文档的一部分,并根据它进行排除.但是,由于每个用户都进行了数十万次扫描,因此阵列可能会变得非常大,因此它不是一个可扩展的解决方案.

有没有办法从Elastic Search查询中排除大量实体,这些实体基于其不会影响性能的ID?

rvh*_*deg 12

使用术语查询的查找功能:术语查找机制

当需要指定具有大量术语的术语过滤器时,从索引中的文档中获取这些术语值会很有用.一个具体的例子是过滤你的粉丝发推文的推文.可能会在术语过滤器中指定的用户ID数量很多.在这种情况下,使用术语过滤器的术语查找机制是有意义的.

  • 为了将来解决这个问题的人们的利益,很高兴看到该解决方案能够实现术语查找机制。 (4认同)

Val*_*Val 11

您可以尝试将ids过滤器添加到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
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)