簡體   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