【问题标题】:Elastic search multi index query弹性搜索多索引查询
【发布时间】:2021-03-14 18:26:37
【问题描述】:

我正在构建一个需要根据多个参数匹配用户的应用。我有两个弹性搜索索引,一个包含用户的好恶,一个包含一些关于用户的元数据。

/user_profile/abc12345

{
"userId": "abc12345",
"likes": ["chocolate", "vanilla", "strawberry"]
}
/user_metadata/abc12345
{
"userId": "abc12345",
"seenBy": ["aaa123","bbb123", "ccc123"] // Potentially hundreds of thousands of userIds
}

有人建议我制作这些单独的索引并交叉引用它们,但我该怎么做呢?例如,我想搜索一个喜欢chocolate 并且没有被用户abc123 看到的用户。如何编写此查询?

【问题讨论】:

    标签: elasticsearch elastic-stack


    【解决方案1】:

    如果这是您的用例中的频繁查询,我建议合并索引(始终根据您的查询设计索引)。

    无论如何,对于您当前的情况,一个可能的解决方法是利用两个索引都将用户标识符存储在同名字段 (userId) 的事实。然后,您可以 (1) 对两个索引发出布尔查询,以匹配基于 likes 字段的一个索引中的文档,以及基于 seenBy 字段的另一个索引中的文档,(2) 使用 @987654321 @bucket 聚合得到满足你条件的唯一userIds 列表。

    例如

    GET user_*/_search
    {
      "size": 0,
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "likes": "chocolate"
              }
            },
            {
              "match": {
                "seenBy": "abc123"
              }
            }
          ]
        }
      },
      "aggs": {
        "by_userId": {
          "terms": {
            "field": "userId.keyword",
            "size": 100
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您的回复!您认为向user_profile 索引添加一个可能很大的字段会对性能产生任何影响吗?
    • 不适用于您描述的用例。我想说,在查询两个索引并聚合它们的响应时,您会对性能产生更多影响。
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多