全文索引
mongodb 中 每个集合只允许创建一个全文索引
// "text"是固定的, key代表字段名
// articles集合上
db.articles.ensureUndex({key:'text'})
db.articles.ensureIndex({key_1:"text",key_2:"text"})
db.articles.ensureIndex({"$**":"text"}) // 对所有字段创建全文索引
全文索引 查询
db.articles.find({ $text: {$search: "coffee"} }) // 查询包含 coffee字符串的集合中所有文件
db.articles.find( { $text: {$search: "aa bb cc" } } ) // 查询带空格隔开的aa bb cc
db.articles.find( { $text: {$search: "aa bb -cc" } } ) //-cc 代表不带cc的字符串
db.articles.find( $text: { $search: " \"aa\" \" bb\" \"cc\"" } ) // 既包含aa,有包含bb,还包含cc &&与的关系
use test
db.test.ensureIndex({ "article": "text" }) // 创建全文索引
// 返回
{
"createdCollectionAutomatically": true,
"numIndexesBefore":1,
"numIndexesAfter": 2,
"ok": 1
}
db.test.insert({"article":"aa bb cc dd "})
db.test.insert({"article":"aa bb dd jj "})
db.test.insert({"article":"aa bb cxdgsdd "})
db.test.find({ $text :{$search: "aa bb"}})
全文索引相似度
$meta操作符:{ score: { $meta: "textScore" } }//查询结果与查询条件相似度
// 写在查询条件后面可以返回结果的相似度
// 与sort一起使用,可以达到较好效果
db.test.find( {$text:{$search: "aa bb"}},{score:{$meta:"textScore"}} )
// 可以查出 与 aa bb 相似度,查出的结果在 score中
{"_id": .., "article":"aa bb rr","score": 1.5} // 类似这样可以对score排序
db.test.find( {$text:{$search: "aa bb"}},{score:{$meta:"textScore"}} ).sort( {score: {$meta: "textScore"} } )
全文索引的限制
1. 每次查询 只能指定一个 $text 查询
2. $text查询不能出现在$nor查询中
3. 查询中若包含了$text,hint不在起作用
4. MongoDB 全文索引还不支持中文
创建索引格式
db.collection.ensureIndex({param},{param})
第二个参数是 索引属性
**重要的属性
1. 名字
db.collection.ensureIndex({},{name:" "})
db.collectionName.getIndexes()
// 比如创建一个
db.test.ensureIndex({x: 1}) // 创建单键索引 x_1
db.test.ensureIndex({y: -1}) // 创建单键索引 y_-1 +-1 代表索引排序方向
db.test.getIndexes() // 查看单键的 索引name x_1
// 创建多个键值索引, 可以使用别名
db.test.ensureIndex({x:1,y:1,z:1},{name:"normal_index"}) // 索引重命名
db.test.dropIndex("normal_index") // 删除时容易些
2. 唯一性 unique 指定
db.collection.ensureIndex({},{unique:true/false})
db.collection.ensureIndex({m: 1,n:1},{unique: true})
// 插入第一条 db.test.insert({m: 1, n: 2})
// 插入第二条 db.test.insert({m: 1, n: 2}) // 插入相同的 报错
3. 稀疏性 sparse 指定
db.collection.ensureIndex({}, {sparse: true/false})
db.test.insert({"m":1}) db.test.insert({"n":1})
db.test.find({m:{$exists: true}}) // 返回的是 m 所在记录
// 加索引 m
db.test.ensureIndex({m:1},{sparse:true})
// 查找时能把n查出来
db.test.find({m:{$exists: false}}) // 全局稀疏索引查找时,查不到就不会用这个全局索引
db.test.find({m:{$exists: false}}).hint("m_1") // 强制使用稀疏索引 就会查不到
4. 是否定时删除
expireAfterSecond(秒) 一般60s 左右会清一次
mongostat 查看mongo运行状态使用命令介绍
- ./bin/mongostat -h 127.0.0.1.12345 -u -p //若有用户名,密码的话加上-u -p
// 打印出详细信息 cursor isMultiKey n nscanned millis /等参数
db.test.find({x:1}).explain()