MongoDB 全文索引
全文索引
从2.4版开始,MongoDB开始支持文本索引来搜索内部字符串内容。该全文索引通过降低所产生停止的话就像使用词干技术,以寻找在字符串字段中指定词语。目前,MongoDB的支持大约15种语言。
| 语言名称 | ISO 639-1(两个字母代码) |
|---|---|
| danish | da |
| dutch | nl |
| english | en |
| finnish | fi |
| french | fr |
| german | de |
| hungarian | hu |
| italian | it |
| norwegian | nb |
| portuguese | pt |
| romanian | ro |
| russian | ru |
| spanish | es |
| swedish | sv |
| turkish | tr |
启用全文索引
最初,全文索引是一项实验性功能,但是从2.6版开始,默认情况下启用该配置。
创建文本索引
考虑posts集合下的以下文档,其中包含帖子文本及其标签-
db.posts.insert([{"post_text": "enjoy the mongodb articles on jc2182", "tags": ["mongodb", "jc2182"]},{"post_text" :"writing tutorials on mongodb","tags" : [ "mongodb", "tutorials" ]}])
我们将在post_text字段上创建一个全文索引,以便我们可以在帖子的文本中进行搜索-
db.posts.createIndex({post_text:"text"})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
使用全文索引
现在,我们在post_text字段上创建了全文索引,我们将搜索所有文本中带有词 jc2182 的帖子。
db.posts.find({$text:{$search:"jc2182"}}).pretty()
{
"_id" : ObjectId("5f4f366d5406e4349a0cd253"),
"post_text" : "enjoy the mongodb articles on jc2182",
"tags" : [
"mongodb",
"jc2182"
]
}
删除全文索引
要删除现有的文本索引,请首先使用以下查询找到索引的名称-
db.posts.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "post_text_text",
"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 }