解决 MongoDB 单文本索引限制

问题描述 投票:0回答:2

我收集了大约 2 亿份文档。我需要建立一个搜索来查找子字符串。即使在搜索字段上使用常规索引,使用正则表达式搜索也非常慢。

答案似乎是文本索引,但每个集合只允许有一个文本索引。我可以使文本索引搜索多个字段,但这实际上会破坏预期的功能,因为它会使结果不准确。我需要指定子字符串应出现在的确切字段。

有什么办法可以绕过这个限制吗?文档说他们的云数据库允许多个索引,但对于这个项目,我需要将数据保存在我们自己的服务器上。

mongodb indexing text-search
2个回答
1
投票

是的,即使您为字段建立索引,如果您使用正则表达式搜索,它仍然会进行集合扫描。并且您只能在单个字段上有文本索引。此外,该文本索引基于单词而不是子字符串,因此文本索引不会执行任何操作。

这些索引(包括文本索引)基本上是根据索引字段按字母顺序(或相反)对文档进行预排序。对于文本字段,它非常相似,但更好一点,因为它索引了所选字段的每个单词。但在您的情况下,由于您正在搜索子字符串,因此文本索引同样无用。

要解决您的问题,通常您必须使用另一个专用数据库,例如 ElasticSearch。

幸运的是,MongoDB Atlas 最近发布了 Atlas 搜索索引,它应该可以解决您的问题。您可以索引多个(或所有)字段,也可以搜索子字符串。它基本上是一个“搜索引擎”。就像 ElasticSearch 一样,它基于流行的开源搜索引擎 Lucene。应用 Atlas 搜索索引后,您可以将聚合与 $search pipeline 一起使用。

但是为了使用此功能,您需要使用 MongoDB Atlas。据我所知,您只能在 MongoDB Atlas 中创建此搜索索引。一旦您设置了 MongoDB Atlas,应用和使用此搜索功能就变得非常简单。您可以转到 MongoDB Atlas,然后转到您的集合,只需点击几下即可应用此搜索索引。您可以对其进行微调(查看文档),但您可以从默认设置开始。

在后端使用它非常简单(来自docs):

db.articles.aggregate(
   [
     { $match: { $text: { $search: "cake" } } },
     { $group: { _id: null, views: { $sum: "$views" } } }
   ]
)

0
投票

对于自托管数据库(mongodb社区用户),可以使用https://github.com/deflexable/mongodb-middleware-utils

它基本上在数组中创建不同的文本排列,因此您可以按前缀搜索文本,也可以选择搜索多个或单个字段。

例如,如果您有一个类似

{ name: 'Alex Albert', bio: 'Hey there! I'm Alex, a passionate tech enthusiast and aspiring software engineer. Currently studying Computer Science at XYZ University, where I'm diving deep into the world of algorithms and coding' }

的字段

您可以仅对个人简介进行搜索,例如

db.collection().find({ $text: { $search: 'a passionate tech enthu', $field: 'bio' } })

您还可以对姓名和个人简介进行搜索,例如

db.collection().find({ $text: { $search: 'Ale', $field: ['name', 'bio'] } })

© www.soinside.com 2019 - 2024. All rights reserved.