繁体   English   中英

Elasticsearch字词查询可排除大量用户

[英]Elasticsearch Terms Query exclude large amount of users

我正在开发类似app的游戏。 为了排除用户之前刷过的个人资料,我使用“ must_not”查询,如下所示:

must_not:[{“ terms”:{“ swipedusers”:[“ userid1”,“ userid1”,“ userid1”…]}}}]

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

有更好的办法! 它称为“术语查找”,就像您可以在关系数据库上执行的传统联接一样。

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

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

最终解决方案是使用2个索引,一个用于注册用户,另一个用于跟踪每个用户的刷卡。 然后,对于每次滑动,您应该更新包含当前用户滑动的文档...在这里,您需要向数组添加元素,这是ElasticSearch中的另一个问题(如果使用的是AWS托管ElasticSearch,则是一个大问题),可以使用脚本解决...更多信息, 访问https://www.elastic.co/guide/zh/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"
            }
        }
    }
}

您还应该考虑的另一件事是滑动索引的复制配置,因为每个节点都将与该索引执行“联接”,因此强烈建议在每个节点中具有该索引的完整副本。 您可以通过使用值为“ 0-all”的“ auto_expand_replicas”创建索引来实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM