Fabric 中的 Cosmos DB 提供强大的全文搜索功能,现已正式发布。 此功能旨在增强应用的本机搜索功能,无需外部搜索服务即可进行基本全文搜索。
什么是全文搜索?
Fabric 中的 Cosmos DB 提供全文索引和搜索,旨在增强搜索和检索工作负载。 此功能包括高级文本处理技术(如词干分解、干扰词删除和词汇切分),从而通过专用文本索引实现高效和有效的文本搜索。 全文搜索还包括全文评分,该功能用于评估文档与给定搜索查询的相关性。 BM25 (Best Matching 25) 综合考虑术语频率、反转文档频率和文档长度等因素来对文档进行评分和排名。 这有助于确保最相关的文档显示在搜索结果的顶部,从而提高文本搜索的准确性和有用性。
全文搜索非常适合各种方案,包括:
电子商务:根据描述、评价和其他文本属性快速查找产品。
内容管理:高效搜索文章、博客和文档。
客户支持:检索相关的支持票证、常见问题解答和知识库文章。
用户内容:分析和搜索用户生成的内容,例如帖子和评论。
针对聊天机器人的 RAG:通过从大型文本语料库检索相关信息来增强聊天机器人响应,从而提高答案的准确性和相关性。
多代理 AI 应用:使多个 AI 代理能够协作搜索和分析大量文本数据,从而提供全面而细致的见解。
如何使用全文搜索
使用全文策略和全文索引配置容器。
插入带有文本属性的数据。
使用全文搜索系统函数对数据运行查询。
为混合搜索配置容器策略和索引
若要使用全文搜索功能,应首先定义两个策略:
容器级全文策略,用于定义包含新全文查询系统函数的文本的路径。
索引策略中添加了全文索引,可实现高效的搜索。
可以在不使用这些策略的情况下运行全文搜索查询,但它们不使用全文索引,并且可能会消耗更多请求单位(RU)。 如果没有此策略,全文搜索也可能需要更长的时间才能执行。 建议定义全文容器和索引策略。
全文策略
对于想要为全文搜索配置的每个文本属性,必须声明文本属性的 path 和文本的 language。 一个简单的全文策略可以是:
{
"defaultLanguage": "en-US",
"fullTextPaths": [
{
"path": "/text",
"language": "en-US"
}
]
}
通过将另一个元素添加到 fullTextPolicy 数组,可以轻松定义多个文本路径:
{
"defaultLanguage": "en-US",
"fullTextPaths": [
{
"path": "/text1",
"language": "en-US"
},
{
"path": "/text2",
"language": "en-US"
}
]
}
重要
全文文本策略或全文索引目前不支持通配符(*,[])。
有关全文策略设置的详细信息和示例,请参阅 全文索引策略示例。
多语言支持
借助多语言支持,可以使用英语以外的语言为文本编制索引和搜索。 它应用特定语言的词汇切分、词干分解和非索引字删除,以获得更准确的搜索结果。
注释
多语言支持处于早期预览状态。 搜索的性能和质量可能与英语全文搜索不同。 例如,目前,非索引字删除仅适用于英语 (en-us)。 在预览版的演变过程中,该功能可能会发生变化。
有关与多语言支持相关的限制的详细信息,请参阅 Cosmos DB 全文限制。
全文索引
任何全文搜索作都应使用 全文索引。 根据以下示例,可以在 Fabric 索引策略中的任何 Cosmos DB 中轻松定义全文索引:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?"
},
],
"fullTextIndexes": [
{
"path": "/text"
}
]
}
与全文策略一样,可以在多个路径上定义全文索引:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?"
},
],
"fullTextIndexes": [
{
"path": "/text"
},
{
"path": "/text2"
}
]
}
全文搜索查询
全文搜索和评分操作在 Cosmos DB 中使用 Fabric 查询语言的以下系统函数执行:
FULLTEXTCONTAINS:如果给定字符串包含在文档的指定属性中,则返回true。 在需要确保查询返回的文档中包含特定关键字时,此函数在WHERE子句中非常有用。FULLTEXTCONTAINSALL:如果所有true给定字符串均包含在文档的指定属性中,则返回 。 在需要确保查询返回的文档中包含多个关键字时,此函数在WHERE子句中非常有用。FULLTEXTCONTAINSANY:如果任何true给定字符串包含在文档的指定属性中,则返回 。 在子句WHERE中,此函数非常有用,可以确保查询返回的文档中至少包含一个关键字。FULLTEXTSCORE:在子句中ORDER BY RANK使用此函数可返回按全文分数排序的文档,将最相关的(最高评分)文档放在顶部,并将最不相关的(最低评分)放在底部。
下面是几个关于所使用的各函数的示例。
FULLTEXTCONTAINS
在此示例中,我们想要获取属性 c.text 中包含短语“red bicycle”的前 10 个结果。
SELECT TOP 10
*
FROM
container c
WHERE
FULLTEXTCONTAINS(c.text, "red bicycle")
FULLTEXTCONTAINSALL
在此示例中,我们希望获取前 10 个结果,其中关键字“red”和“bicycle”包含在属性 c.text中,但不一定一起包含。
SELECT TOP 10 *
FROM c
WHERE FULLTEXTCONTAINSALL(c.text, "red", "bicycle")
FULLTEXTCONTAINSANY
在此示例中,我们想要获取属性 c.text 中包含关键词“red”和“bicycle”或“skateboard”的前 10 个结果。
SELECT TOP 10
*
FROM
container c
WHERE
FULLTEXTCONTAINS(c.text, "red") AND
FULLTEXTCONTAINSANY(c.text, "bicycle", "skateboard")
FULLTEXTSCORE
在此示例中,我们想要获取包含“mountain”和“bicycle”的前 10 个结果,并按相关性顺序进行排序。 也就是说,频繁出现这些关键词的文档应出现在列表中更靠前的位置。
SELECT TOP 10
*
FROM
container c
ORDER BY RANK
FULLTEXTSCORE(c.text, "bicycle", "mountain")
重要
FULLTEXTSCORE只能在ORDER BY RANK子句中使用,不可在SELECT语句或WHERE子句中投影。
模糊搜索
模糊搜索可以提高对拼写错误和文本变体的容错能力。 可以在搜索词和文档文本之间指定允许的“距离”(编辑次数),允许将接近匹配项视为命中。 可指定的最大距离为 2(两次编辑)。
注释
模糊搜索处于早期预览阶段。 通过预览版的演变,性能、质量和功能可能会发生变化。
SELECT TOP 10
*
FROM
container c
WHERE
FULLTEXTCONTAINS(c.text, {"term": "red", "distance":1}, {"term": "bicycle", "distance":2})