文本索引 MongoDB,搜索字符串的最小长度

Ank*_*mar 4 mongoose mongodb

我已经从 mongo shell 为集合 X 创建了一个文本索引

db.X.ensureIndex({name: 'text', cusines: 'text', 'address.city': 'text'})
Run Code Online (Sandbox Code Playgroud)

现在,如果一个文档的 name 属性值为seasons,则其长度为 7

所以如果我运行查找查询(搜索字符串长度<= 5)

db.X.find({$text: {$search: 'seaso'}})
Run Code Online (Sandbox Code Playgroud)

如果我将搜索字符串更改为season (长度 >= 6) ,它不会返回任何值,然后返回文档。

现在我的问题是搜索字符串是否有一些最小长度限制来获取记录。如果是的话有什么办法可以改变吗?

gly*_*ing 5

MongoDB$text搜索不支持部分匹配。MongoDB 允许支持对字符串内容的文本搜索查询,并支持不区分大小写和词干

看看你的例子:

// this returns nothing because there is no inferred association between 
// the value: 'seasons' and your input: 'seaso'
db.X.find({$text: {$search: 'seaso'}})

// this returns a match because 'season' is seen as a stem of 'seasons'
db.X.find({$text: {$search: 'season'}})
Run Code Online (Sandbox Code Playgroud)

因此,这不是输入长度的问题。搜索seaso不会返回任何匹配项,因为:

  • 您的文本索引不包含整个单词:seaso
  • 您的文本索引不包含可seaso识别词干的整个单词

这假设您的文本索引的语言是英语,您可以通过运行来确认这一点db.X.getIndexes(),您将在文本索引的定义中看到这一点:

"default_language" : "english"
Run Code Online (Sandbox Code Playgroud)

FWIW,如果您的索引不区分大小写,那么以下内容也将返回匹配项:

db.X.find({$text: {$search: 'SEaSON'}})
db.X.find({$text: {$search: 'SEASONs'}})
Run Code Online (Sandbox Code Playgroud)

更新1:针对这个问题“is it possible to use RegExp”

假设该name属性包含该值seasons并且您正在搜索,seaso则以下内容将与您的文档匹配:

db.X.find({type: {$regex: /^seaso/}})
Run Code Online (Sandbox Code Playgroud)

文档中有更多详细信息,但是...

  • 这不会使用您的文本索引,因此如果您继续使用$regex运算符,那么您将不需要文本索引。
  • 运算符的索引覆盖率$regex可能不是您所期望的,简要总结如下:如果您的搜索值是锚定的(即seaso,而不是easons),那么 MongoDB 可以使用索引,但否则不能。