【问题标题】:Text Indexes MongoDB, Minimum length of search string文本索引 MongoDB,搜索字符串的最小长度
【发布时间】:2017-09-18 21:19:53
【问题描述】:

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

db.X.ensureIndex({name: 'text', cusines: 'text', 'address.city': 'text'})

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

所以如果我运行查找查询(使用长度为

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

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

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

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    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 可以使用索引,否则它不能。

    【讨论】:

    • @AnkitKumar 我已经更新了答案以包含一个显示使用$regex的示例。
    • 好的,那么不需要文本索引,我将使用 RegExp 和 $or 运算符使其适用于多个道具。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2018-09-27
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多