英文原文地址:https://docs.mongodb.com/v3.2/text-search/。
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。
文本搜索
概述
MongoDB支持在字符串内容上执行文本搜索。要使用文本搜索,MongoDB使用文本索引(text index)和$text
操作符。
例子
下面的例子演示了如何创建文本索引,并用来查找咖啡店,只通过文本字段。
用以下文档创建一个stores
集合:
db.stores.insert(
[
{ _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" }
]
)
文本索引
MongoDB提供了文本索引,来支持在字符串内容上进行文本搜索。文本索引可以包含是字符串类型的任意字段,或者元素为字符串的数组。
要执行文本搜索,必须在集合中有文本索引。一个集合只能有一个文本索引,但是这个索引可以覆盖多个字段。
例如,你可以在mongo
shell中运行如下命令来在name
和description
字段中执行文本搜索:
db.stores.createIndex( { name: "text", description: "text" } )
$text操作符
使用$text
查询操作符在有文本索引的集合上做文本搜索。
$text
将会用空格和大多数标点作为分隔符对搜索字符串进行分词,然后对搜索字符串中的所有token进行逻辑或操作。
例如,可以用下面的查询来找出所有包含”coffee”、”shop”和”java”中任意一个的商店。
db.stores.find( { $text: { $search: "java coffee shop" } } )
精确短语
通过把短语包含在双引号内,可以做精确短语搜索。例如,下面的查询将会查找所有包含”java”或者”coffee shop”的文档:
db.stores.find( { $text: { $search: "java \"coffee shop\"" } } )
排除单词
要排除一个单词,可以在前面增加一个”-“。例如,要找出所有包含”java”或”shop”,但是不包含”coffee”的所有商店,用如下查询:
db.stores.find( { $text: { $search: "java shop -coffee" } } )
排序
MongoDB默认返回的结果是无序的。然而,文本搜索查询会计算每个文档的相关度,表示文档对查询的匹配度高低。
要对结果按相关度查询,必须显式投影$meta
textScore
字段,然后对它排序:
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
在聚集管道中也可以用文本搜索。
语言支持
MongoDB支持多种语言的文本搜索。查看文本搜索语言以获取支持的语言列表。