【问题标题】:Using MongoDb Atlas full text search with multi-tenant collection ($searchBeta)使用带有多租户集合的 MongoDb Atlas 全文搜索 ($searchBeta)
【发布时间】:2020-02-13 19:27:56
【问题描述】:

我有一个 MongoDb 集合,其中包含数千个租户的数据,这些数据由包含租户 ID 的字段分隔。
我想对特定租户执行包含全文搜索和分面的查询(见下文)。
由于 $searchBeta 必须是聚合管道中的第一阶段,这意味着它将返回来自所有租户的大量文档列表,只是为了在 $match 阶段将它们过滤掉,而不是使用索引。
有没有更有效的方法来执行这样的查询?
使用 $searchBeta 运行它需要 14 秒,而删除它会将查询时间减少到 6 毫秒(而分面适用于更多文档,因为它包含所有租户的数据)。
* 使用 Doug 的回答将其减少到 ~70-120 毫秒。
* 时间测量是在 Atlas 免费层上完成的,所以它并不意味着太多

db.tenantData.aggregate( [
{
    $searchBeta: {
        "search": {
        "query": "test",
        "path": ["name","comment"],
      }
    }
},
{
    $match: {tenant:"tenant1"},
},
{
    $facet: {
        "AssetTypeFacet": [
          { $sortByCount: "$assetType" }
        ],
        "manufacturerFacet": [
          { $sortByCount: "$manufacturer" }
        ]
    }
}
])    

【问题讨论】:

  • 在 MongoDB 手册中找不到 $searchBeta ......

标签: mongodb mongodb-atlas mongodb-atlas-search


【解决方案1】:

您可以像这样将查询组合成compound

db.tenantData.aggregate([
  {
    $searchBeta: {
      compound: {
        should: {
          search: { query: "test", path: ["name", "comment"] },
        },
        filter: {
          search: { query: "tenant1", path: "tenant" },
        },
      },
    },
  },
  {
    $facet: {
      AssetTypeFacet: [{ $sortByCount: "$assetType" }],
      manufacturerFacet: [{ $sortByCount: "$manufacturer" }],
    },
  },
]);

这将消除与$match 关联的IO。目前没有其他方法可以直接在$searchBeta 中进行分面,除了您已经完成的方式。

【讨论】:

  • 这不会在具有相似值的租户中过滤吗?
  • 现在在搜索阶段有分面
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2013-09-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2021-04-17
相关资源
最近更新 更多