MongoDB之索引(全文索引)
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是在某个字段上实现的模糊查询,但是这个时候返回的信息并不会很准确,因为只能够查A字段或者是B字段,而在MongoDB里面实现了非常简单的全文检索
千家信息网最后更新 2026年11月03日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安全错误
数据库的锁怎样保障安全
圆梦互联网科技
互联网与科技金融数据
壹账通互联网科技
唐信互联网科技 大连
互联网科技汛
北京华百购互联网科技有限公司
互联网为啥属于高科技
和信科技工业互联网
哈尔滨屹滨互联网科技有限公司
众安科技工业互联网合作
2021互联网科技公司排名
互联网金融科技公司的优势
广东工业互联网大赛深圳学泰科技
工业互联网科技创业
新氧科技和美国互联网有关系吗
互联网科技接地气
中国互联网公司的科技投入
科技互联网经济论坛
恒生互联网科技趋势
高科技和互联网的现代国家
互联网与科技
宜安科技 互联网金融
广西拼得多互联网科技有限公司
科技与互联网哪个更好
科技赋能视角下互联网保险发展
产业互联网科技服务公司
四川互联网展示科技馆设计
扫呗互联网科技有限公司
神州科技互联网有限公司
恒生科技互联网指数十大成分股