azure - 有没有办法从 Azure 认知搜索索引中排除 NULL 值

标签 azure indexing filter azure-cosmosdb azure-cognitive-search

例如,我们有字段 1 到 10。我想在 Azure 搜索中对所有字段建立索引,以便您可以在这些过滤器上进行筛选和搜索。

我的问题是,有没有办法从特定 ID 中排除 NULL 字段,从而不将它们存储在 Azure 搜索中?请参阅下面的示例。

数据本身最初存储在 Azure Cosmos 数据库中。 在 Azure Cosmos DB 中,它会像这样:

  • ID 1
  • 字段 1:a
  • 字段 2:b
  • 字段 5:c
  • 字段 6:d
  • 字段 8:e


  • ID 2
  • 字段 3:a
  • 字段 2:b
  • 字段 5:c
  • 字段 9:d
  • 字段 10:e

但是在 Azure 搜索索引中,它看起来像这样:

  • ID 1
  • 字段 1:a
  • 字段 2:b
  • 字段 3:NULL
  • 字段 4:NULL
  • 字段 5:c
  • 字段 6:d
  • 字段 7:NULL
  • 字段 8:e
  • 字段 9:NULL
  • 字段 10:NULL


  • ID 2
  • 字段 1:NULL
  • 字段 2:b
  • 字段 3:a
  • 字段 4:NULL
  • 字段 5:c
  • 字段 6:NULL
  • 字段 7:NULL
  • 字段 8:NULL
  • 字段 9:d
  • 字段 10:e

最佳答案

对你的问题最简短的回答是“不”,但比这更深入一点。

将文档添加到 Azure 认知搜索索引时,每个字段的值都存储在称为倒排索引的数据结构中。这存储了在该字段中找到的术语的字典,并且每个条目都包含包含该术语的文档 ID 列表。在这方面,它有点类似于面向列的数据库。您在文档 JSON 中看到的 null 值实际上从未存储在倒排索引中。这可能会使测试字段是否为空的成本变得昂贵,因为查询需要查找不包含在倒排索引中的所有文档 ID,但它在存储方面非常高效(因为它不消耗任何内容)。

This article有一些关于倒排索引如何工作的简化示例,尽管它与您的问题涉及不同的主题。

您对在索引中定义许多字段的更广泛的担忧是合理的。当您增加索引中的字段数量时,需要在架构灵活性和资源利用率之间进行权衡。但是,这是由于每个字段所需的簿记开销,而不是“字段中的空值数量”(这实际上没有任何意义,因为不存储空值)。

从您的问题来看,听起来您正在尝试在同一索引中对不同的“实体类型”进行建模,从而导致稀疏索引,其中某些文档子集定义了一个字段子集,而另一文档子集定义了一个字段子集定义了不同的字段。这是我们希望在服务中更好支持的场景。一个有前途的 future 方向可能是支持多索引查询,因此架构的每个子集都可以拥有自己的索引,以及自己不同(但可能重叠)的字段集。这不在我们当前的路线图上,但我们希望进一步调查。请投票this User Voice item帮助我们确定优先顺序。

关于azure - 有没有办法从 Azure 认知搜索索引中排除 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62695523/

相关文章:

jQuery 将参数传递给带有 contains 子句的过滤语句

azure - 将字符串字段转换为 Azure 表存储中的日期时间字段

indexing - Lucene IndexWriter.Close() 与 indexWriter.Commit()

Python 索引错误 : list index out of range

django - 在 Django admin 中按自定义日期范围过滤

应用过滤器后 Excel 填充单元格区域

Azure Active Directory Multi-Tenancy : User doesn't exist in tenant

Azure B2C - MSAL - 使用更新的声明获取 ID token

azure - Azure 为记录提供的 IP 地址出现 404 错误

mysql - 使用索引优化此查询的最佳方法是什么?