MongoDB 查询文档中使用文本选择器($text)

之前我们介绍过使用比较选择器、逻辑选择器、元素选择器、数组选择器查询文档,如果您需要进一步了解,可以参考:

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)

danish

da

dutch

nl

english

en

finnish

fi

french

fr

german

de

hungarian

hu

italian

it

norwegian

nb

portuguese

pt

romanian

ro

russian

ru

spanish

es

swedish

sv

turkish

tr

$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进行文本检索时,需要在检索的字段上建立文本索引

猜你喜欢

转载自blog.csdn.net/m1729339749/article/details/130605491