我在MongoDB的数据库中有一个约31.3M文档的数据集。我需要在每个文档的属性中搜索特定的字符串,如果在任何属性中找到,那么该文档就是匹配的情况。
目前,我已经对需要检查字符串并通过以下代码匹配它的属性进行了文本索引
我的主要问题是时间复杂性,运行上面的查询大约需要25-35分钟,而我希望结果以秒/毫秒为单位。
await collectionName.aggregate([{
$match: {
$text: {
$search: uniqueActiveName
}
}
},
{
$out: "tempCollectionName"
}
]).toArray()
我将匹配文档的结果返回到一个新集合中,以便可以对过滤结果执行进一步的操作。
请在此处检查我的文档结构sampleJSON
我已经对以下属性进行了文本索引
await collectionName.createIndex({
articleTitle: "text",
"abstract.background": "text",
"abstract.objective": "text",
"abstract.method": "text",
"abstract.results": "text",
"abstract.conclusions": "text",
"abstract.unassigned": "text",
materialAndMethods: "text",
acknowledgement: "text",
conflictOfInterestOrDeclarationsOfInterest: "text",
contributionsOfAuthorsOrContributions: "text",
funding: "text",
}, {
default_language: "none",
language_override: "none"
})
1条答案
按热度按时间0tdrvxhp1#
抱歉,这不是一个真正的答案,但这将是太长的离开作为一个评论。
希望在3000多万个文档上运行跨越12个字段的全文搜索,并以毫秒级的响应时间,这可能是不合理的(特别是当您将它们写入另一个集合时)。
在网上找到mongo全文搜索的基准有点困难,但我看到的一些数字建议800 ms/100 k文档,但没有说明文档的大小,另一个建议10分钟44 GB的语料库,但再次-没有哪部分数据被搜索可悲。
有几件事可能是导致速度缓慢的原因,还有一些事情需要考虑。
1.你的$out会把这些写进一个实际的集合,这取决于你的mongo版本和选项,可能需要大多数成员确认这些实际上已经被写到磁盘上--这本质上是非常慢的
1.您的文档非常大,将这些文档的所有字段写入一个新的集合会使它更慢。
1.您的集群有多少内存,您尝试使用的文本索引有多大?
1.在此查询运行时,您能否从集群中获取指标-复制所用的时间是多少?
1.您会/预计会在其中每一项上获得多少结果?
一般来说,除非您 * 真的 * 需要全文搜索(例如,您需要一个分数),最好不要使用它,并坚持严格的索引。(在您的应用服务器上)将所有这些字段连接在一起,按空格拆分,转换为小写并删除重复项,然后将这些值存储为一个数组并对该数组进行索引。当搜索时,您对查询执行相同的操作,并使用$in来查找它们-这为您提供了单词级别的匹配,如果需要更大的粒度,可以更进一步使用n-gram。