[英]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.