这两个功能看起来非常相似,但Atlas Search很新鲜,而且可能更强大。Atlas Search 可以替代 MongoDb 中的文本索引吗?文本索引会被弃用吗?我是否错过了一些本质区别?Atlas Search是Atlas云平台的专有功能吗?
我有一个 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) 该文档指出path需要是一个string而不是一个字符串数组。我只是想确认这实际上是唯一的可能性,如果在任何一种情况下都有推荐的方法来做到这一点。
例如,我想搜索(带有自动完成),我的电影文本"hammer"上都title和plot
在当前场景中,我可以通过title或plot轻松实现搜索。但是如果我尝试对两者都这样做,制作path一个字符串数组,这在其他运算符上是可以接受的,我会收到一个错误
在 MongoDB Atlas 搜索的文档中,它对autocomplete运算符做了以下说明:
query:要搜索的一个或多个字符串。如果字符串中有多个术语,Atlas Search 还会分别为字符串中的每个术语查找匹配项。
对于text操作员来说,同样的事情也适用:
query:要搜索的一个或多个字符串。如果字符串中有多个术语,Atlas Search 还会分别为字符串中的每个术语查找匹配项。
对我来说,单独匹配每个术语似乎很奇怪。我们需要在应用程序中进行多次搜索,对于每次搜索,我们预计您输入的单词越多,结果就越少,而不是更多。
示例:搜索“John Doe”时,我期望只包含“John”和“Doe”的结果。目前,我得到与“John”或“Doe”匹配的结果。
使用 MongoDB Atlas Search 是不可能的,还是我做错了什么?
更新 目前,我已经通过在空格('')上拆分搜索词并将每个单独的关键字添加到单独的必须子子句(使用复合运算符)来解决它。但是,如果一个关键字只有一个字符,则搜索查询将不再返回任何结果。考虑到这一点,我将包含一个字符的关键字与包含多个字符的关键字分开。下面的代码片段有效,但为此我需要在每个文档上保存两个生成的字段:
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
我有以下架构:
{
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 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
我的目标是创建一个索引+搜索管道,因此我可以通过搜索“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 地图集搜索,目标是自动完成 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)
但是通配符解决方案似乎不起作用 - 没有返回任何相关结果......