MongoDB之索引(全文索引)
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是在某个字段上实现的模糊查询,但是这个时候返回的信息并不会很准确,因为只能够查A字段或者是B字段,而在MongoDB里面实现了非常简单的全文检索
千家信息网最后更新 2025年01月22日MongoDB之索引(全文索引)在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是在某个字段上实现的模糊查询,但是这个时候返回的信息并不会很准确,因为只能够查A字段或者是B字段,而在MongoDB里面实现了非常简单的全文检索。
范例:定义一个新的集合
db.news.insert({"title":"stoneA","content":"ttA"});
db.news.insert({"title":"stoneB","content":"ttB"});
db.news.insert({"title":"stoneC","content":"ttC"});
db.news.insert({"title":"stoneD","content":"ttD"});
范例:创建全文索引
> db.news.createIndex({"title":"text","content":"text"});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
范例:实现数据的模糊查询
如果要想表示出全文检索,则使用"$text"判断符,而要想进行数据的查询则使用"$search"运算符:
● 查询指定的关键字:{"$search":"查询关键字"}
● 查询多个关键字(或关系):{"$search":"查询关键字 查询关键字 ..."}
● 查询多个关键字(与关系):{"$search":"\"查询关键字\" \"查询关键字\" ..."}
● 查询多个关键字(排除某一个):{"$search":"查询关键字 查询关键字 ...-排查关键字"}
范例:查询单个内容
> db.news.find({"$text":{"$search":"stoneA"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }
范例:查询包含有"stoneA"和"stoneB"的信息
> db.news.find({"$text":{"$search":"stoneA stoneB"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbc"), "title" : "stoneB", "content" : "ttB" }
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }
范例:查询同时包含有"ttC"和"ttD"
> db.news.find({"$text":{"$search":"\"ttC\" \"ttD\""}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE" }
{ "_id" : ObjectId("5992c61d0184ff511bf02bc2"), "title" : "stoneD", "content" : "ttC ttD ttF" }
范例:查询包含有"ttE"但是不包含"ttF"
> db.news.find({"$text":{"$search":"ttE -ttF"}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE" }
但是在进行全文检索操作的时候还可以使用相似度的打分来判断检索结果。
范例:为查询结果打分
> db.news.find({"$text":{"$search":"ttC ttD ttE"}},{"score":{"$meta":"textScore"}}).sort({"score":{"$meta":"textScore"}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE", "score" : 2 }
{ "_id" : ObjectId("5992c61d0184ff511bf02bc2"), "title" : "stoneD", "content" : "ttC ttD ttF", "score" : 1.3333333333333333 }
按照打分的成绩进行排列,实际上就可以实现更加准确的信息搜索。
如果一个集合的字段太多了,那么每一个字段都分别设置全文索引比较麻烦,简单一些,可以为所有字段设置全文索引。
范例:为所有字段设置全文索引
> db.news.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.news.createIndex({"$**":"text"});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
这是一种最简单的设置全文索引的方式,但是尽可能别用,会慢。
范例:定义一个新的集合
db.news.insert({"title":"stoneA","content":"ttA"});
db.news.insert({"title":"stoneB","content":"ttB"});
db.news.insert({"title":"stoneC","content":"ttC"});
db.news.insert({"title":"stoneD","content":"ttD"});
范例:创建全文索引
> db.news.createIndex({"title":"text","content":"text"});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
范例:实现数据的模糊查询
如果要想表示出全文检索,则使用"$text"判断符,而要想进行数据的查询则使用"$search"运算符:
● 查询指定的关键字:{"$search":"查询关键字"}
● 查询多个关键字(或关系):{"$search":"查询关键字 查询关键字 ..."}
● 查询多个关键字(与关系):{"$search":"\"查询关键字\" \"查询关键字\" ..."}
● 查询多个关键字(排除某一个):{"$search":"查询关键字 查询关键字 ...-排查关键字"}
范例:查询单个内容
> db.news.find({"$text":{"$search":"stoneA"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }
范例:查询包含有"stoneA"和"stoneB"的信息
> db.news.find({"$text":{"$search":"stoneA stoneB"}})
{ "_id" : ObjectId("5992c4310184ff511bf02bbc"), "title" : "stoneB", "content" : "ttB" }
{ "_id" : ObjectId("5992c4310184ff511bf02bbb"), "title" : "stoneA", "content" : "ttA" }
范例:查询同时包含有"ttC"和"ttD"
> db.news.find({"$text":{"$search":"\"ttC\" \"ttD\""}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE" }
{ "_id" : ObjectId("5992c61d0184ff511bf02bc2"), "title" : "stoneD", "content" : "ttC ttD ttF" }
范例:查询包含有"ttE"但是不包含"ttF"
> db.news.find({"$text":{"$search":"ttE -ttF"}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE" }
但是在进行全文检索操作的时候还可以使用相似度的打分来判断检索结果。
范例:为查询结果打分
> db.news.find({"$text":{"$search":"ttC ttD ttE"}},{"score":{"$meta":"textScore"}}).sort({"score":{"$meta":"textScore"}})
{ "_id" : ObjectId("5992c61d0184ff511bf02bc1"), "title" : "stoneC", "content" : "ttC ttD ttE", "score" : 2 }
{ "_id" : ObjectId("5992c61d0184ff511bf02bc2"), "title" : "stoneD", "content" : "ttC ttD ttF", "score" : 1.3333333333333333 }
按照打分的成绩进行排列,实际上就可以实现更加准确的信息搜索。
如果一个集合的字段太多了,那么每一个字段都分别设置全文索引比较麻烦,简单一些,可以为所有字段设置全文索引。
范例:为所有字段设置全文索引
> db.news.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.news.createIndex({"$**":"text"});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
这是一种最简单的设置全文索引的方式,但是尽可能别用,会慢。
查询
关键
关键字
范例
全文
字段
索引
信息
检索
全文检索
多个
时候
数据
是在
结果
相似
内容
单个
同时
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
mc服务器怎么玩
网络技术应用信息技术选修三
软件开发的岗位有哪些岗位
惠普服务器一般多少g
今朝网络安全众测
阿里云服务器挖矿程序攻击
内蒙古数据库空投箱定制价格
甘肃省网络安全实验室
软件开发采购清单明细
国外cs服务器
现行规范性法律文件数据库
软件开发项目合同书
网络安全的绘画作品图片
海口回收交换机和服务器的吗
非关系型数据库技术研究动态
化学工程与工艺数据库
软件开发的瀑布模型
移动软件开发就业
数字货币交易软件开发违法吗
网络安全文章素材
为什么要学数据库及其应用
服务器定时自动重启
部落冲突哪个服务器比较好
信息网络技术发展的趋势
软件开发可以自己做老板吗
南京社交软件开发
机器人软件开发需要哪些知识
金华网络安全知识考试
网页没有图片保存到数据库吗
数据库实验安全性控制