【问题标题】:Elasticsearch Terms Query exclude large amount of usersElasticsearch 条款查询排除大量用户
【发布时间】:2016-10-30 03:59:56
【问题描述】:

我正在开发一个类似火种的应用程序。为了排除用户之前刷过的个人资料,我使用了这样的“must_not”查询:

must_not : [{"terms": { "swipedusers": ["userid1", "userid1", "userid1"...]}}]

我想知道使用这种方法有什么限制?当 swipedusers 数组包含 2000 个用户 ID 时,这是一种可扩展的方法吗?如果有更好的可扩展方法,我会很高兴知道...

【问题讨论】:

标签: elasticsearch


【解决方案1】:

有更好的方法!它称为“术语查找”,类似于您可以在关系数据库上执行的传统联接...

我可以尝试在这里向您解释,但是,您需要的所有信息都在官方 Elastic Search 页面上有详细记录:

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-terms-query.html#query-dsl-terms-lookup

最终的解决方案是有 2 个索引,一个用于注册用户,另一个用于跟踪每个用户的滑动。 然后,对于每次滑动,您应该更新包含当前用户滑动的文档......在这里您需要将元素添加到数组中,这是 ElasticSearch 中的另一个问题(如果您使用 AWS 托管的 ElasticSearch,这是个大问题),只能使用脚本解决... 更多信息https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html#_using_scripts_to_make_partial_updates

对于您的情况,查询将产生如下结果:

GET /possible_matches/_search
{
    "query" : {
        "terms" : {
            "user" : {
                "index" : "swiped",
                "type" : "users",
                "id" : "current-user-id",
                "path" : "swipedUserId"
            }
        }
    }
}

您应该考虑的另一件事是 swipes 索引的复制配置,因为每个节点都会与该索引执行“连接”,因此强烈建议在每个节点中拥有该索引的完整副本。您可以使用“0-all”值的“auto_expand_replicas”创建索引。

PUT /swipes
{
    "settings": {
        "auto_expand_replicas": "0-all"
    }
}

【讨论】:

  • 哇,非常感谢。这很好用。虽然这种方法引入了一个问题……当用户 A 查询用户(滑动他们)时,我想给已经喜欢用户 B 的用户评分更高,因为匹配的机会显然更高。但是对于术语查找,我需要指定一个固定的 ID。有没有办法让这个 id 动态化,就像它总是当前查询记录的 id 一样。例如,如果第一个命中结果是用户 c,那么术语查找会检查用户 c 的刷卡记录吗?
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多