使用mongoose正则表达式与文本在mongo db中搜索

时间:2016-03-05 09:58:04

标签: mongodb text mongoose

任何人都可以解释一下之间的区别:

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

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

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

2 个答案:

答案 0 :(得分:3)

$regex

  

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

$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来比较它们。

答案 1 :(得分:3)

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

  

<强>正则表达式

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

  • 正则表达式允许您搜索部分文本。因此。*以及许多其他模式。

  • 正则表达式不支持停止或干扰词。

  

<强> $文本

mongodb中的

文本索引非常快,应该是首选。但是,MongoDB不实现全功能文本索引。一个主要缺点是,它不支持部分匹配。例如如果你正在寻找猫,它将只搜寻猫和猫,但不会搜索山猫或蚂蚱。

  

底线是,如果您希望实现像RDBMS like运算符这样的功能,'$ text'将无法帮助您(至少在MongoDB的当前实现中,但将来它可能会更改)。