标签: mongodb-atlas-search

Mongodb:文本索引与 Atlas 搜索

这两个功能看起来非常相似,但Atlas Search很新鲜,而且可能更强大。Atlas Search 可以替代 MongoDb 中的文本索引吗?文本索引会被弃用吗?我是否错过了一些本质区别?Atlas Search是Atlas云平台的专有功能吗?

full-text-search mongodb mongodb-atlas mongodb-atlas-search

7
推荐指数
1
解决办法
1754
查看次数

使用 MongoDb Atlas 全文搜索和多租户集合 ($searchBeta)

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

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

mongodb mongodb-atlas mongodb-atlas-search

5
推荐指数
1
解决办法
1098
查看次数

如何在多个字段上运行自动完成 $search?

文档指出path需要是一个string而不是一个字符串数组。我只是想确认这实际上是唯一的可能性,如果在任何一种情况下都有推荐的方法来做到这一点。

例如,我想搜索(带有自动完成),我的电影文本"hammer"上都titleplot

在当前场景中,我可以通过titleplot轻松实现搜索。但是如果我尝试对两者都这样做,制作path一个字符串数组,这在其他运算符上是可以接受的,我会收到一个错误

mongodb-atlas mongodb-atlas-search

5
推荐指数
1
解决办法
627
查看次数

MongoDB Atlas 搜索 - 搜索字符串中的多个术语带有“and”条件(不是“or”)

在 MongoDB Atlas 搜索的文档中,它对autocomplete运算符做了以下说明:

query:要搜索的一个或多个字符串。如果字符串中有多个术语,Atlas Search 还会分别为字符串中的每个术语查找匹配项。

对于text操作员来说,同样的事情也适用:

query:要搜索的一个或多个字符串。如果字符串中有多个术语,Atlas Search 还会分别为字符串中的每个术语查找匹配项。

对我来说,单独匹配每个术语似乎很奇怪。我们需要在应用程序中进行多次搜索,对于每次搜索,我们预计您输入的单词越多,结果就越少,而不是更多。

示例:搜索“John Doe”时,我期望只包含“John”“Doe”的结果。目前,我得到与“John”“Doe”匹配的结果。

使用 MongoDB Atlas Search 是不可能的,还是我做错了什么?


更新 目前,我已经通过在空格('')上拆分搜索词并将每个单独的关键字添加到单独的必须子子句(使用复合运算符)来解决它。但是,如果一个关键字只有一个字符,则搜索查询将不再返回任何结果。考虑到这一点,我将包含一个字符的关键字与包含多个字符的关键字分开。下面的代码片段有效,但为此我需要在每个文档上保存两个生成的字段:

  • searchString:所有可搜索字段连接在一起的字符串。Fe“约翰·多伊·曼·街市”
  • searchArray:将上面的字符串大写并按空格('')分割成一个数组
const must = [];
const searchTerms = 'John D'.split(' ');
for (let i = 0; i < searchTerms.length; i += 1) {
    if (searchTerms[i].length === 1) {
      must.push({
        regex: {
          path: 'searchArray',
          query: `${searchTerms[i].toUpperCase()}.*`,
        },
      });
    } else if (searchTerms[i].length > 1) {
      must.push({
        autocomplete: {
          query: searchTerms[i], …
Run Code Online (Sandbox Code Playgroud)

search autocomplete mongodb mongodb-atlas mongodb-atlas-search

5
推荐指数
1
解决办法
2883
查看次数

Atlas 搜索对象数组

我有以下架构:

{
   name: String,
   phones: [
        {
            number: String,
            type: String
        }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我如何索引phones.number以便我可以编写类似以下内容的内容:

collection.aggregate([{
       "$search":{ 
            "compound":{
                  "should":[
                      {"autocomplete":{"query":"012345","path":"name"}},
                      {"autocomplete":{"query":"012345","path":"phones.number"}}
                  ]
             }
         }
}])
Run Code Online (Sandbox Code Playgroud)

这里的文档给出了字符串数组的示例,但没有提供对象数组的示例。

mongodb mongodb-atlas mongodb-atlas-search

4
推荐指数
1
解决办法
2989
查看次数

MongoDB Atlas搜索自动完成索引错误评分

我有一个 MongoDB Atlas 搜索索引,其中字段名称具有自动完成类型,并且具有以下属性:

maxGrams : 15
minGrams : 2
tokenization: edgeGram
fold diacritics: true
Run Code Online (Sandbox Code Playgroud)

该集合包含以下名称:

The American
The American Equity Underwriters
The American Prairie Foundation
The American Conservatory Theater
The American Club
Run Code Online (Sandbox Code Playgroud)

使用此自动完成查询:

{
  autocomplete: {
    query: 'The American',
    path: 'name'
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用以下 searchScore 检索上面的所有名称:

The American Conservatory Theater -> 15.474836349487305
The American Equity Underwriters -> 15.379003524780273
The American Prairie Foundation -> 15.379003524780273
The American Club -> 15.271049499511719
The American -> 13.68109130859375
Run Code Online (Sandbox Code Playgroud)

即使美国是完全匹配的,它也会得到较低的分数。

为什么精确匹配搜索分数低于其他搜索分数?

lucene full-text-indexing mongodb mongodb-atlas mongodb-atlas-search

4
推荐指数
1
解决办法
874
查看次数

MongoDB Atlas全文搜索中查询单词子集

我的目标是创建一个索引+搜索管道,因此我可以通过搜索“reprod”找到以下文档:

{ name: "can you find this and reproduce?" }
Run Code Online (Sandbox Code Playgroud)

我拥有的

我正在使用默认索引。我的搜索管道如下所示:

$search: {
    text: {
        query: 'reprod',
        path: 'name',
    },
},
Run Code Online (Sandbox Code Playgroud)

但这不起作用——只有当我在查询中提供整个单词时,我才能得到完整的结果。我希望返回该文档,即使我只提供单词的子集。

mongodb-atlas-search

2
推荐指数
1
解决办法
955
查看次数

MongoDB全文搜索,两个字段自动完成

我正在尝试实现MongoDB 地图集搜索,目标是自动完成 2 个字段。

我目前有这个实现:

const searchStep = {
    $search: {
        // Read more about compound here:
        // https://docs.atlas.mongodb.com/reference/atlas-search/compound/
        compound: {
            must: [
                {
                    autocomplete: {
                        query,
                        path: 'name',
                    },
                },
                {
                    autocomplete: {
                        query,
                        path: 'description',
                    },
                },
            ],
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,似乎只有在名称描述匹配时才起作用。我怎样才能解决这个问题,所以我查询这两个名称和描述?

我现在尝试使用通配符选项:

{
    wildcard: {
        query,
        path: ['name', 'description'],
        allowAnalyzedField: true,
    }
}
Run Code Online (Sandbox Code Playgroud)

但是通配符解决方案似乎不起作用 - 没有返回任何相关结果......

mongodb-atlas-search

1
推荐指数
1
解决办法
662
查看次数