MongoDB CRUD操作: 在本地实例进行文本搜索查询
文章目录
在本地实例运行文本搜索查询前,必须先在集合上建立文本索引。MongoDB提供文本索引,支持对字符串内容的文本搜索查询。文本索引可以包含任何值为字符串或字符串元素数组的字段。一个集合只能有一个文本搜索索引,但索引可以有多个字段。
举例
下面的示例演示了如何建立文本索引,并利用它根据文本字段查找咖啡店。
创建集合
使用下面的脚本创建stores
集合:
js
db.stores.insertMany(
[
{ _id: 1, name: "Java Hut", description: "Coffee and cakes" },
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
{ _id: 3, name: "Coffee Shop", description: "Just coffee" },
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },
{ _id: 5, name: "Java Shopping", description: "Indonesian goods" }
]
)
创建文本索引
在mongosh中运行下面的命令,对名称和描述字段创建索引:
js
db.stores.createIndex( { name: "text", description: "text" } )
精准搜索
可以通过用双引号将要搜搜的文本引起来进行精确搜索,如果$search
字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。
例如,以下命令将查找包含"coffee shop"
的所有文档:
js
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
排除短语
可以在前面加上一个"-"字符来排除一个单词。例如,要查找所有包含"java"
或"shop"
但不包含"coffee "
的商店,使用下面的命令:
js
db.stores.find( { $text: { $search: "java shop -coffee" } } )
结果排序
默认情况下,MongoDB以未排序的方式返回结果,不过,文本搜索查询会为每个文档计算一个相关性得分,以确定文档与查询的匹配程度。
要按相关性得分排序结果,必须显式地投影$meta textScore
字段,并根据它排序:
js
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
聚合管道中也支持文本搜索。