检索仅包含活动用户ID的对象

57hvy0tb  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(373)

对dynamo db和elastic search来说还是很新的。
所以我有两张table。
表1:包含要显示的项表2:包含具有布尔值的活动列的用户。 { active: true } 我要做的是检索所有具有 active: true ,然后从表1中检索包含所有这些ID的对象。
第一步:找到活跃用户

let activeUsersResult = await es.search({
      index: userTable, //table2
      body: {
              "query": {
                "bool": {
                  "must": 
                    {
                      "match": { "active": "true" }
                    }

                }
            }
        }
    })

这种方法奏效了。我的表包含8个活动用户,但它仅检索7个活动用户。我本来想联系aws的支持人员来解决这个问题的,但是如果是这样的话答案会很好,但不是这里的重点。
步骤2:获取活动用户ID

let activeIds = activeUsersResult.hits.hits.map( item => item._source.userId )

这给了我一个所有活动ID的数组,它可能看起来像:

activeIds = ['id1', 'id2', 'id3', etc....]

步骤3:从表1中获取只包含那些activeid的items对象
注意:这个es.search也执行搜索功能

let itemsResult = await es.search({
        index: itemTable, //table 1
        body:{
              "query": {
                "bool": {
                  "must": [
                    {
                        "query_string": {
                            "query": e.searchQuery + "*",
                            "fields": ["item_name"]
                        }
                    },
                    {
                      "match": { "sold_out": "false" },
                      "match": { "userIds" : activeIds }
                    }
                  ]
                }
            }
        }
    })

赛道是我遇到麻烦的地方。 "match": { "userIds" : activeIds } 我需要一个只包含那些匹配activeid的对象数组。我本来希望打出来能给我一些想法,但我还是迷路了。
谢谢!

l7wslrjt

l7wslrjt1#

我建议你用 term 以及 terms 查询而不是匹配。当需要与数组匹配时,应该使用 terms 查询。所以您的查询应该如下所示。

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": e.searchQuery + "*",
            "fields": [
              "item_name"
            ]
          }
        },
        {
          "term": {
            "sold_out": "false"
          }
        },
        {
          "terms": {
            "userIds": activeIds
          }
        }
      ]
    }
  }
}

阅读“关于术语”和“术语查询”,了解它们的工作原理。

相关问题