MongoDB 文本搜索

从 2.4 版开始,MongoDB 开始支持文本索引来搜索字符串内容。文本索引对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

这个过程类似于通过字典中的检索字表查字的过程。

MongoDB 目前支持15种语言的全文索引。

启用文本搜索

最初,文本搜索是一项实验性功能,但从 2.6 版开始,该配置默认启用。如果你使用之前的版本,你需要使用以下代码来启用全文检索:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

或者使用命令:

$ mongod --setParameter textSearchEnabled=true

创建文本索引

考虑以下 posts 集合的文档数据,包含了文章内容(post_text)及标签(tags):

> db.posts.insert({
   "post_text": "enjoy the mongodb articles on jiyik",
   "tags": ["mongodb", "jiyik"]
}
{
    "post_text" : "writing tutorials on mongodb",
    "tags" : [ "mongodb", "tutorial" ]
})
WriteResult({ "nInserted" : 1 })

我们将在 post_text 字段上创建一个文本索引,以便我们可以在文本中搜索

> db.posts.createIndex({post_text:"text"})
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

使用文本索引

现在我们已经在 post_text 字段上创建了文本索引,我们将搜索文本中包含单词 jiyik 的所有帖子。

> db.posts.find({$text:{$search:"tutorialspoint"}}).pretty()
{
    "_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
    "post_text" : "enjoy the mongodb articles on tutorialspoint",
    "tags" : [
        "mongodb",
        "tutorialspoint"
    ]
}

上面的命令返回以下结果文档,在其帖子文本中包含单词 jiyik

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on jiyik", 
   "tags" : [ "mongodb", "jiyik" ]
}

删除文本索引

要删除现有的文本索引,首先使用以下查询找到索引的名称

> db.posts.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "mydb.posts"
    },
    {
        "v" : 2,
        "key" : {
            "fts" : "text",
            "ftsx" : 1
        },
        "name" : "post_text_text",
        "ns" : "mydb.posts",
        "weights" : {
            "post_text" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }
]
>

从上述查询中获取索引名称后,运行以下命令。此处,post_text_text是索引的名称。

> db.posts.dropIndex("post_text_text")
{ "nIndexesWas" : 2, "ok" : 1 }

查看笔记

扫码一下
查看教程更方便