[英]Elasticsearch Terms Query exclude large amount of users
我正在开发类似app的游戏。 为了排除用户之前刷过的个人资料,我使用“ must_not”查询,如下所示:
must_not:[{“ terms”:{“ swipedusers”:[“ userid1”,“ userid1”,“ userid1”…]}}}]
我想知道使用这种方法的局限性是什么? 这种可扩展的方法在swipedusers数组包含2000个用户ID时也可以使用吗? 如果有更好的可扩展方法,我很高兴知道...
有更好的办法! 它称为“术语查找”,就像您可以在关系数据库上执行的传统联接一样。
我可以在这里向您解释,但是,您需要的所有信息都在官方的Elastic Search页面上有详细记录:
最终解决方案是使用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.