欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

全文检索

程序员文章站 2022-07-01 09:41:23
...


进入MongoDB中文手册(4.2版本)专栏

MongoDB ATLAS搜索
Atlas Search在MongoDB数据之上,使构建基于关联的快速搜索功能成为可能。您可以试用MongoDB Atlas,它是完全托管的数据库即服务(fully managed database as a service)。

1 概述

MongoDB支持执行字符串内容的全文检索。MongoDB使用文本索引和$text运算符执行全文检索。

注意
视图不支持全文检索。

2 示例

此示例演示了如何在仅指定文本字段的情况下构建文本索引并使用它来查找咖啡店。
使用以下文档创建一个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" }
   ]
)

2.1 文本索引

MongoDB提供全文检索以支持对字符串内容的文本搜索查询。文本索引可以包含任何值为字符串或字符串元素数组的字段。
要执行文本搜索查询,您t的集合上必须有一个文本索引。一个集合只能有一个文本搜索索引,但是该索引可以包含多个字段。
例如,您可以在mongo shell中运行以下命令,从而允许对name和description字段进行全文检索:

db.stores.createIndex( { name: "text", description: "text" } )

2.2 $text运算符

使用$text查询运算符对具有文本索引的集合执行全文检索。
$text将使用空格和大多数标点符号作为分隔符来对查询字符串分词,并对搜索字符串中的所有分词执行OR逻辑运算。
例如,您可以使用以下示例查找包含列表“ coffee”,“ shop”和“ java”中任何词语的所有商店:

db.stores.find( { $text: { $search: "java coffee shop" } } )

2.3 精确短语(exact phrases)

可以通过将词语包括在双引号中,来精确短语的搜索。如果$search字符串包含短语和单个词语,则全文检索将仅匹配包含短语的文档。
例如,以下将查找包含“coffee shop”的所有文档:

db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

有关更多信息,请参见短语

2.4 排除语句(Term Exclusion)

要排除一个单词,可以在前面加上一个“ -”字符。例如,要查找所有包含“ java”或“ shop”但不包含“ coffee”的商店,请使用以下命令:

db.stores.find( { $text: { $search: "java shop -coffee" } } )

2.5 排序

默认情况下,MongoDB将以未排序的顺序返回结果。但是,文本搜索查询将为每个文档计算相关性分数,以指定文档与查询的匹配程度。
要按相关性得分的顺序对结果进行排序,必须显式投影$meta textScore字段并对其进行排序:

db.stores.find(
   { $text: { $search: "java coffee shop" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

聚合管道中也提供全文检索。

3 语言支持

MongoDB支持多种语言的全文检索。有关支持的语言列表,请参见全文检索语言

进入MongoDB中文手册(4.2版本)专栏