全文搜索(有时称为词法搜索)是 Azure Cosmos DB for NoSQL 中的一项功能,可用于高效查询文本数据。 它使用专用索引和评分系统来提供相关结果。 此功能包括一种文本相关性方法,该方法使用 BM25 (最佳匹配 25) 算法对搜索结果进行排序。 此排名系统考虑三个关键因素:术语频率、反转文档频率和文档长度。 此方法可帮助应用程序从 Azure Cosmos DB 数据中搜索和检索最相关的文本文档,而无需使用 Lucene 或 Elasticsearch 等外部搜索服务。
概况
Azure Cosmos DB 中全文搜索涉及哪些处理步骤?
Azure Cosmos DB 中的全文搜索应用多种文本处理技术,以提高搜索相关性和效率。 该系统采用词干分解技术,能将单词还原为其词根形式。 它还执行 停用词删除 操作,消除“the”和“and”等常见字词,因为这些词不会为搜索结果增加价值。 此外,它还使用标记化将文本分解为可搜索单位。 这些处理步骤有助于确保查询返回最有意义的相关文档。
Azure Cosmos DB 中的全文索引是否支持通配符路径?
否,全文容器策略或索引目前不支持通配符,如 * 和 [] 。 相反,应当明确地定义完整的文件路径。
为什么 Azure Cosmos DB 全文查询的延迟和/或 RU 费用较高?
多种因素可能导致高延迟或 RU 消耗:
- 查询选择性
- 索引词数(单词)
- 容器中的文档数
- Cosmos DB 容器的物理分区数
最好确保为查询路径正确设置全文容器和索引策略。 例如,如果使用 FullTextScore(c.text, ...),则应在 c.text 路径上设置全文容器和索引策略。
在此处了解有关全文策略的详细信息。
在 Azure Cosmos DB 中,使用 FullTextScore 进行 ORDER BY RANK 排序时,为何会出现高延迟或高 RU 费用?
如果查询包含长短语,则使用 ORDER BY RANK FullTextScore(...)的成本可能很高。 建议将短语拆分为单个关键字以提高性能。 例如,而不是:
ORDER BY RANK FullTextScore(c.text, "mountain bicycle with performance shocks")
您可以选择使用:
ORDER BY RANK FullTextScore(c.text, "mountain bicycle", "with", "performance shocks")
我能否看到 FullTextscore 返回的分数?
截至目前,在查询的 SELECT 子句中无法投影 FullTextScore。
为什么我的搜索结果与预期不同?
如果要将 Azure Cosmos DB 中的全文搜索结果与为 Cosmos DB 数据编制索引的搜索引擎的结果进行比较,结果可能略有不同。 这种差异通常是因为以下原因之一:
- 停用词过滤:Cosmos DB 会自动删除搜索引擎可能包含的常见单词“the”和“and”。
- 词干分解差异:Cosmos DB 使用特定于语言的规则将单词还原为其词根形式,这可能与搜索引擎采用的方法有所不同。
- 评分算法:Cosmos DB 使用标准 BM25 评分,其优化方式可能与引擎的排名逻辑不同。
- 标记化规则:Cosmos DB 将文本分解为可搜索单位的方式可能与引擎的 tokenizer 不同。
- 语言支持:Cosmos DB 的多语言支持目前处于预览状态,其行为可能与那些针对非英语语言拥有成熟分析器的引擎不同。
- 模糊搜索行为:Cosmos DB 的模糊搜索限制为最多 2 个编辑和 10 个建议,其实现仍处于预览状态,因此模糊搜索的结果与其他搜索引擎相比可能有所不同。
最佳做法
在 Azure Cosmos DB 中使用全文搜索有哪些最佳做法?
下面是在 Azure Cosmos DB 中使用全文搜索时要考虑的一些最佳做法:
- 始终定义全文策略和全文索引以实现最佳性能。
- 使用
FullTextContainsAll或FullTextContainsAny - 仅在
FullTextScore子句中使用ORDER BY RANK。
局限性
Azure Cosmos DB 中全文搜索的已知限制是什么?
下面是 Azure Cosmos DB 中全文搜索的一些已知限制:
- 数组的通配符路径(*、[])在全文策略或索引中不受支持。
- 在短语(即包含空格的多个单词的字符串)上使用
FullTextScore可能会比单独搜索每个单词更慢。 - 多语言支持处于预览状态,性能可能不一致。 停用词删除目前仅适用于英语(en-US)。
- 模糊搜索也处于预览状态,最大编辑距离限制为 2 和 10 条建议。
- 当前不支持在
FullTextScore中使用JOIN查询
Azure Cosmos DB 中全文搜索是否存在已知问题?
下面是 Azure Cosmos DB 中全文搜索的一些已知问题:
- 提供错误的语法
FullTextScore可能会导致 500 错误而不是预期的 400 错误。 - 使用和
ORDER BY RANKFullTextScore执行查询时,结果在 macOS 或 Linux 客户端上可能与 Windows 客户端略有不同。