之前我们介绍过使用比较选择器、逻辑选择器、元素选择器、数组选择器查询文档,如果您需要进一步了解,可以参考:
MongoDB 查询文档中使用比较选择器、逻辑选择器https://blog.csdn.net/m1729339749/article/details/129965699
MongoDB 查询文档中使用元素选择器、数组选择器https://blog.csdn.net/m1729339749/article/details/129971708
本篇,我们介绍使用$text选择器查询文档:
一、准备工作
初始化学生信息数据
db.studentInfos.insertMany([
{ "_id": 1, "name": "张三1", "sports": "羽毛球、乒乓球", fruits: "apple, banana", introduce: "大家好,我喜欢运动,但是我不喜欢铅球,因为它太重了" },
{ "_id": 2, "name": "李四1", "sports": "篮球、乒乓球、跑步", fruits: "Apple", introduce: "大家好,我喜欢水果,但是不喜欢吃橘子,因为它太酸了" },
{ "_id": 3, "name": "王五1", "sports": "足球、羽毛球", fruits: "Banana", introduce: "大家好,我喜欢水果,喜欢运动" },
{ "_id": 4, "name": "张三2", "sports": "网球、铅球", fruits: "orange", introduce: "大家好,我喜欢水果与健身" },
{ "_id": 5, "name": "李四2", "sports": "乒乓球", fruits: "Orange, Apple", introduce: "大家好,我喜欢乒乓球运动" },
{ "_id": 6, "name": "王五2", "sports": "篮球", fruits: "Orange, Banana", introduce: "hello,i like sports" },
{ "_id": 7, "name": "张三3", "sports": "跑步、跳绳", fruits: "Orange, apple, Banana", introduce: "haha, 与健身相比,我更喜欢吃" },
{ "_id": 8, "name": "李四3", "sports": "足球", fruits: "orange, banana", introduce: "足球和橘子是我的最爱" },
{ "_id": 9, "name": "王五3", "sports": "跆拳道", fruits: "Banana", introduce: "我不喜欢健身,我喜欢突破自己" }
])
二、文本选择器($text)
语法:
{
$text:
{
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>
}
}
$search:指的是待搜索的文本
$language:可选,指的是语言,默认值是none,使用时可以使用长的语言名称或者ISO 639-1
支持的语言如下:
Language Name | ISO 639-1 (Two letter codes) |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$caseSensitive:指的是区分大小写,默认为false(不区分大小写)
三、例子:检索furits中包含apple的文档
db.studentInfos.find({
$text: {
$search: "apple"
}
})
执行文档查询发现报错了:
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
报错了,原因是需要在搜索的字段上建立文本索引
下面我们在fruits字段上建立文本索引:
db.studentInfos.createIndex( { fruits: "text" } )
然后再执行查询文档的操作,结果如下:
{ "_id" : 2, "name" : "李四1", "sports" : "篮球、乒乓球、跑步", "fruits" : "Apple", "introduce" : "大家好,我喜欢水果,但是不喜欢吃橘子,因为它太酸了" }
{ "_id" : 5, "name" : "李四2", "sports" : "乒乓球", "fruits" : "Orange, Apple", "introduce" : "大家好,我喜欢乒乓球运动" }
{ "_id" : 1, "name" : "张三1", "sports" : "羽毛球、乒乓球", "fruits" : "apple, banana", "introduce" : "大家好,我喜欢运动,但是我不喜欢铅球,因为它太重了" }
{ "_id" : 7, "name" : "张三3", "sports" : "跑步、跳绳", "fruits" : "Orange, apple, Banana", "introduce" : "haha, 与健身相比,我更喜欢吃" }
发现fruits中带有Apple的也被检索出来,原因是默认情况下是不区分大小写的,如果想区分大小写,可使用下面的查询命令:
db.studentInfos.find({
$text: {
$search: "apple",
$caseSensitive: true
}
})
查询的结果如下:
{ "_id" : 1, "name" : "张三1", "sports" : "羽毛球、乒乓球", "fruits" : "apple, banana", "introduce" : "大家好,我喜欢运动,但是我不喜欢铅球,因为它太重了" }
{ "_id" : 7, "name" : "张三3", "sports" : "跑步、跳绳", "fruits" : "Orange, apple, Banana", "introduce" : "haha, 与健身相比,我更喜欢吃" }
需要注意的是使用$text进行文本检索时,需要在检索的字段上建立文本索引