我已经从mongo shell
为集合X创建了一个文本索引db.X.ensureIndex({name: 'text', cusines: 'text', 'address.city': 'text'})
现在,如果名称属性值为四季的文档,其长度为7
所以,如果我运行查询查询(搜索字符串的长度为< = 5)
db.X.find({$text: {$search: 'seaso'}})
如果我将搜索字符串更改为季节(长度> = 6),则它不返回任何值,然后返回文档。
现在我的问题是搜索字符串是否有一些最小长度约束来获取记录。 如果有,那么有什么方法可以改变它吗?
答案 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可以使用索引,但不能使用索引。