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

时间:2017-09-18 21:19:53

标签: mongodb mongoose

我已经从mongo shell

为集合X创建了一个文本索引
db.X.ensureIndex({name: 'text', cusines: 'text', 'address.city': 'text'})

现在,如果名称属性值为四季的文档,其长度为7

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

db.X.find({$text: {$search: 'seaso'}})

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

现在我的问题是搜索字符串是否有一些最小长度约束来获取记录。 如果有,那么有什么方法可以改变它吗?

1 个答案:

答案 0 :(得分:3)

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'}})

所以,这不是输入长度的原因。在seaso上搜索不会返回匹配项,因为:

  • 您的文字索引不包含整个字词:seaso
  • 您的文字索引不包含seaso是公认词干的整个词

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

"default_language" : "english"

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

db.X.find({$text: {$search: 'SEaSON'}})
db.X.find({$text: {$search: 'SEASONs'}})

更新1:以回复此问题"是否可以使用RegExp"

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

db.X.find({type: {$regex: /^seaso/}})

the docs中的更多细节,但......

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