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

时间:2020-07-02 11:38:16

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

例如,我们的字段1最多为10。我想索引Azure搜索中的所有字段,以便您可以进行筛选,并在这些筛选器上进行搜索。

我的问题是,有没有一种方法可以从特定ID中排除NULL字段,而不是将其存储在Azure搜索中?参见下面的示例。

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

  • 编号1
  • 领域1:a
  • 领域2:b
  • 字段5:c
  • 字段6:d
  • 字段8:e


  • 编号2
  • 领域3:a
  • 领域2:b
  • 字段5:c
  • 字段9:d
  • 领域10:e

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

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


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

3 个答案:

答案 0 :(得分:1)

您问题的最短答案是“否”,但是比这个要深。

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

This article给出了一些简化的示例,说明倒排索引的工作原理,尽管它的主题与您的问题不同。

关于在索引中定义许多字段的更广泛的关注是有效的。随着增加索引中字段的数量,架构灵活性和资源利用率之间需要权衡。但是,这是由于每个字段都需要记账的开销,而不是“字段中的空位数”(这并不意味着任何事情,因为不存储空值)。

从您的问题来看,似乎您正在尝试在同一索引中对不同的“实体类型”建模,从而导致索引稀疏,其中文档的某些子集定义了一个字段子集,而文档的另一子集具有定义了不同的字段。我们希望在服务中更好地支持这种情况。一个有前途的未来方向可能是支持多索引查询,因此架构的每个子集都可以拥有自己的索引,并具有自己独特(但可能重叠)的字段集。这不是我们的近期路线图,但是我们需要进一步研究。请对this User Voice item进行投票,以帮助我们确定优先级。

答案 1 :(得分:0)

就不保存空值而言,AFAIK是不可能的。认知搜索中的索引具有预定义的架构(非常类似于关系数据库表),并且基于属性的数据类型,属性的值将使用默认值(大多数数据类型为null)进行初始化。

答案 2 :(得分:0)

如果您关心的是存储,那么这不是问题,因为它是倒排索引。

如果您对返回的JSON数据的复杂性有疑问,则可以实现自己的中间服务,该中间服务仅对JSON隐藏所有NULL值。因此,您的应用程序查询自己的查询服务,而查询服务又查询实际的Azure服务。仅按原样传递所有参数。唯一的区别是您的服务会从JSON中删除键/值,从而使响应更易于管理。

搜索后的响应似乎与您的Cosmos记录相同。