mongo索引
1.查看当前集合中有哪些索引
db.imooc_collection.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "imooc.imooc_collection"
}
]
2.创建一个普通单键索引
db.imooc_collection.ensureIndex({x:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
表示在x字段创建一个普通索引.这个索引是正向的排序规则.如果希望创建一个反向的索引的话使用:
> db.imooc_collection.ensureIndex({x:-1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
将创建时候对应字段的排序值由正1改成-1.就行.
系统会默认在进行数据插入的时候创建一个普通索引.
3.复合索引.
就是一次性创建多个普通索引.例如
> db.imooc_2.ensureIndex({x:1},{y:1})
{
"ok" : 0,
"errmsg" : "The field 'y' is not valid for an index specification. Specification: { key: { x: 1.0 }, name: \"x_1\", y: 1.0 }",
"code" : 197,
"codeName" : "InvalidIndexSpecificationOption"
}
表示创建了 x和y两个字段的符合索引.
4.创建全文索引.一般情况下全文索引是用来进行文章中关键字的搜索使用.比如想根据某个指定的关键字进行文章的查找.就可以使用全文索引进行实现.
是首先在数据库中创建一个全文索引.
表示给article字段创建一个全文索引.
db.imooc_2.ensureIndex({"article":"text"})
然后像数据库中插入各种数据.
使用全文索引进行数据的查询
db.imooc_2.find({$text:{$search:"aa"}})
查询文章中有aa内容的文档.但是貌似遇到一个问题.就是如果查找的东西中如果查找的关键字没有被分隔的话默认是不会找出来进行打印输出的.
自己用的使用 空格和逗号分隔都可以进行分隔内容的查找.
> db.imooc_2.find({$text:{$search:"有道笔记"}})
{ "_id" : ObjectId("5c0595cd1148fac6c85beb7d"), "article" : "有道笔记,笔记本" }
如果再进行查找的关键词中有多个那么可以再进行内容匹配的时候使用空格进行关键词的分隔即可.
这种查找多个关键词的方式mongo使用的是或查询,只要满足其中一个条件就可以将内容查找出来.
> db.imooc_2.find({$text:{$search:"有道笔记 笔记本"}})
{ "_id" : ObjectId("5c0595cd1148fac6c85beb7d"), "article" : "有道笔记,笔记本" }
如果要进行关键词排出的话可以再进行多个关键词查找的时候对关键词进行过滤掉.在进行查找的时候就不会将排出的内容所对应的文档查找出来.
> db.imooc_2.insert({"article":"有道笔记,笔记本,电脑"})
WriteResult({ "nInserted" : 1 })
> db.imooc_2.insert({"article":"有道笔记,笔记本,电脑,桌子"})
WriteResult({ "nInserted" : 1 })
> db.imooc_2.insert({"article":"有道笔记,笔记本,电脑,桌子,水杯."})
WriteResult({ "nInserted" : 1 })
> db.imooc_2.find({$text:{$search:"有道笔记 笔记本 -水杯"}})
{ "_id" : ObjectId("5c0595cd1148fac6c85beb7d"), "article" : "有道笔记,笔记本" }
{ "_id" : ObjectId("5c0597441148fac6c85beb7e"), "article" : "有道笔记,笔记本,电脑" }
{ "_id" : ObjectId("5c0597471148fac6c85beb7f"), "article" : "有道笔记,笔记本,电脑,桌子" }
使用且语句进行内容的查找.在查找内容中使用引号将查找的内容包裹就可以,但是需要加上转移符反斜杠.
> db.imooc_2.find({$text:{$search:"\"有道笔记\" \"桌子\""}})
{ "_id" : ObjectId("5c0597471148fac6c85beb7f"), "article" : "有道笔记,笔记本,电脑,桌子" }
{ "_id" : ObjectId("5c05974c1148fac6c85beb80"), "article" : "有道笔记,笔记本,电脑,桌子,水杯." }
查找内容相关性的搜索.如果并且对内容相关性进行匹配的比较.
> db.imooc_2.find({$text:{$search:"笔记本 桌子"}},{score:{$meta:"textScore"}})
{ "_id" : ObjectId("5c0597441148fac6c85beb7e"), "article" : "有道笔记,笔记本,电脑", "score" : 0.6666666666666666 }
{ "_id" : ObjectId("5c0595cd1148fac6c85beb7d"), "article" : "有道笔记,笔记本", "score" : 0.75 }
{ "_id" : ObjectId("5c05974c1148fac6c85beb80"), "article" : "有道笔记,笔记本,电脑,桌子,水杯.", "score" : 1.2 }
{ "_id" : ObjectId("5c0597471148fac6c85beb7f"), "article" : "有道笔记,笔记本,电脑,桌子", "score" : 1.25 }
发现查找出来的字段中多了一个score的字段.这个字段越大表示匹配度越高.
然后指定已经查找出来的某一个字段进行数值的排序.得到的结果中第一条就是相似的最高的内容结果.
> db.imooc_2.find({$text:{$search:"电脑 桌子"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
{ "_id" : ObjectId("5c0597471148fac6c85beb7f"), "article" : "有道笔记,笔记本,电脑,桌子", "score" : 1.25 }
{ "_id" : ObjectId("5c05974c1148fac6c85beb80"), "article" : "有道笔记,笔记本,电脑,桌子,水杯.", "score" : 1.2 }
{ "_id" : ObjectId("5c0597441148fac6c85beb7e"), "article" : "有道笔记,笔记本,电脑", "score" : 0.6666666666666666 }
浙公网安备 33010602011771号