【问题标题】:Searching in mongo db using mongoose regex vs. text使用 mongoose 正则表达式与文本在 mongodb 中搜索
【发布时间】:2016-03-05 21:59:22
【问题描述】:

谁能解释一下两者的区别:

db.collection.find({ $text: { $search: "dog cat" } })

Product.find({ "drug": { "$regex": "cols", "$options": "i" } })

我们什么时候应该去哪一个?

【问题讨论】:

  • 感谢您的解释。但我还有一个疑问。我正在使用 $text 并使用 $score 投影根据相关性对结果进行排序。但我也需要像正则表达式一样使用匹配部分字符串的功能。有什么方法可以同时使用它们吗?
  • 您可以在具有文本索引的字段上使用正则表达式。但是,如果您正在寻找两全其美的方法,不幸的是它还不支持。让我们期待美好。

标签: mongodb text mongoose


【解决方案1】:

嗯,正则表达式和文本搜索 ($text) 都可以帮助您非常有效地搜索文本。两者各有优缺点,但有两个明显的区别

正则表达式

  • 正则表达式不利用索引,除非您使用 ^ 运算符在字符串开头进行搜索。

  • Regex 允许您搜索部分文本。因此 .* 和许多其他模式。

  • Regex 不支持停用词或干扰词。

$文本

mongodb 中的文本索引非常快,应该是首选。但是,MongoDB 并没有实现全功能的文本索引。一个主要缺点是,它不支持部分匹配。例如如果您正在搜索猫,它将只搜索猫和猫,而不是山猫或毛毛虫。

底线是,如果您希望实现 RDBMS like 运算符之类的功能,“$text”对您没有帮助(至少在 MongoDB 的当前实现中,但将来可能会改变)。

【讨论】:

  • 嗨,我尝试通过以下方式同时使用两者: db.products.find({ $text: { $search: { $regex: "test", $options: "i" } } }, {score : { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } ) 它抛出一个错误 Error: error: { "$err" : "Can't canonicalize查询:BadValue $search 需要一个字符串”,“代码”:17287 } 有什么方法可以同时使用吗?我是 mongo 的新手。请帮忙
【解决方案2】:

$regex

为查询中的模式匹配字符串提供正则表达式功能。 MongoDB 使用支持 UTF-8 的 Perl 兼容正则表达式(即“PCRE”)版本 8.36。

$text

对使用text index 索引的字段的内容执行文本搜索。


数据

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

要搜索字段sku是单个字符串值,可以使用$regex

db.products.find( { sku: { $regex: /^ABC/i } } )

而搜索字段description是文本内容值,可以使用$text,当然我们首先要在description上建立文本索引。

db.products.find( { $text: { $search: "coffee" } } )

为什么不只是正则表达式?

  • regular expressions 有其天然的局限性,因为它们缺乏任何词干提取功能,并且无法以微不足道的方式处理方便的搜索查询,例如 “action -superhero”
  • 他们不能使用传统的索引,这使得在大型数据集中的查询非常缓慢。

这里有一个link 来比较它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多