MongoDB 文本搜索
从2.4版本开始,MongoDB开始支持文本索引,以在字符串内容中搜索。文本搜索使用词干提取技术,在字符串字段中查找指定的单词,同时去除词干停用词,如a、an、the等。目前,MongoDB支持约15种语言。
启用文本搜索
最初,文本搜索是一个实验性的功能,但从2.6版本开始,默认情况下启用了配置。
创建文本索引
考虑以下包含帖子文本和标签的posts集合中的文档示例-
> db.posts.insert({
"post_text": "enjoy the mongodb articles on tutorialspoint",
"tags": ["mongodb", "tutorialspoint"]
}
{
"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字段上创建了文本索引,我们将搜索所有在其文本中包含词汇 tutorialspoint 的帖子。
> db.posts.find({text:{search:"tutorialspoint"}}).pretty()
{
"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [
"mongodb",
"tutorialspoint"
]
}
上面的命令返回了以下具有单词 tutorialspoint 在其帖子文本中的结果文档−
{
"_id" : ObjectId("53493d14d852429c10000002"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [ "mongodb", "tutorialspoint" ]
}
删除文本索引
要删除现有的文本索引,请首先使用以下查询找到索引的名称−
>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 }