Fabric 中的 Cosmos DB 中的全文索引和搜索

Fabric 中的 Cosmos DB 提供强大的全文搜索功能,现已正式发布。 此功能旨在增强应用的本机搜索功能,无需外部搜索服务即可进行基本全文搜索。

Fabric 中的 Cosmos DB 提供全文索引和搜索,旨在增强搜索和检索工作负载。 此功能包括高级文本处理技术(如词干分解、干扰词删除和词汇切分),从而通过专用文本索引实现高效和有效的文本搜索。 全文搜索还包括全文评分,该功能用于评估文档与给定搜索查询的相关性。 BM25 (Best Matching 25) 综合考虑术语频率、反转文档频率和文档长度等因素来对文档进行评分和排名。 这有助于确保最相关的文档显示在搜索结果的顶部,从而提高文本搜索的准确性和有用性。

全文搜索非常适合各种方案,包括:

  • 电子商务:根据描述、评价和其他文本属性快速查找产品。

  • 内容管理:高效搜索文章、博客和文档。

  • 客户支持:检索相关的支持票证、常见问题解答和知识库文章。

  • 用户内容:分析和搜索用户生成的内容,例如帖子和评论。

  • 针对聊天机器人的 RAG:通过从大型文本语料库检索相关信息来增强聊天机器人响应,从而提高答案的准确性和相关性。

  • 多代理 AI 应用:使多个 AI 代理能够协作搜索和分析大量文本数据,从而提供全面而细致的见解。

  1. 使用全文策略和全文索引配置容器。

  2. 插入带有文本属性的数据。

  3. 使用全文搜索系统函数对数据运行查询。

若要使用全文搜索功能,应首先定义两个策略:

  • 容器级全文策略,用于定义包含新全文查询系统函数的文本的路径。

  • 索引策略中添加了全文索引,可实现高效的搜索。

可以在不使用这些策略的情况下运行全文搜索查询,但它们不使用全文索引,并且可能会消耗更多请求单位(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})