Использование полнотекстового поиска MongoDb Atlas с многопользовательской коллекцией ($ searchBeta) - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть коллекция MongoDb, в которой хранятся данные о тысячах арендаторов, которые разделены полем, содержащим идентификатор арендатора.
Я хочу выполнить запрос, включающий полнотекстовый поиск и фасетирование для указанного c арендатора (см. ниже).
Поскольку $ searchBeta должен быть первой фазой в конвейере агрегации, это означает, что он вернет огромный список документов от всех арендаторов просто для того, чтобы отфильтровать их на фазе $ match вместо использования индекса.
Есть ли более эффективный способ выполнить такой запрос?
Выполнение его с помощью $ searchBeta занимает 14 секунд, а его удаление сокращает время запроса до 6 мс (в то время как фасетирование работает с большим количеством документов, поскольку включает в себя все данные арендатора).
* Используя приведенный ниже ответ Дуга, уменьшите его до ~ 70-120 мс.
* Измерение времени было выполнено на уровне без атласа, поэтому оно не значит слишком много

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

1 Ответ

1 голос
/ 15 февраля 2020

Вы можете объединить запрос в [составной] [1], например, так:

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" }
        ]
    }
}
]) 

This will eliminate the IO associated with `$match`. There is currently no way to do faceting directly in `$searchBeta` other than the way you've done it.

  [1]: https://docs.atlas.mongodb.com/reference/full-text-search/compound/
...