Azure 搜索:在 OData 上下文/查询中分组还是区分?
Azure Search: Group By or Distinct in OData context / Query?
使用 Azure 搜索服务,我需要能够按查询中的字段进行分组或使用不同的字段。
用例:
我的业务模型具有 "resources" 的概念,其中有 >=1 次修订。 1 个修订是 Azure 索引中的 1 个文档。我需要模拟 "select the most recently changed resources from the index while also allowing pagination" 之类的东西,因此我需要能够将索引中的文档分组到资源中并按它们进行搜索的能力
Azure 搜索不直接在查询语言中支持 distinct 或 group-by 等运算符。但是,还有其他方法可以实现您想要的。
一种方法是使索引中的每个文档成为资源而不是资源的修订版。然后你可以有一个 complex collection field 来代表每个资源的修订。这种方法有一些潜在的注意事项:
- 如果每个资源有很多(即 - 数千)修订,则它无法很好地扩展。事实上,文档中所有集合的复杂对象限制为 3000 个。
- 要添加新修订,您必须 read-modify-write 整个修订集合,因为 Azure 搜索不支持 intra-collection 合并。
- 如果查询的主要单位确实是修订而不是资源,那么将修订建模为文档更为自然。但是,根据您需要的查询模式,您始终可以拥有多个索引。
另一种方法是添加一个布尔字段,如 IsLatestVersion
,但是当您向索引添加新修订时,您需要将先前修订的标志设置为 false。上面使用复杂类型的方法可能会更直接。
使用 Azure 搜索服务,我需要能够按查询中的字段进行分组或使用不同的字段。
用例: 我的业务模型具有 "resources" 的概念,其中有 >=1 次修订。 1 个修订是 Azure 索引中的 1 个文档。我需要模拟 "select the most recently changed resources from the index while also allowing pagination" 之类的东西,因此我需要能够将索引中的文档分组到资源中并按它们进行搜索的能力
Azure 搜索不直接在查询语言中支持 distinct 或 group-by 等运算符。但是,还有其他方法可以实现您想要的。
一种方法是使索引中的每个文档成为资源而不是资源的修订版。然后你可以有一个 complex collection field 来代表每个资源的修订。这种方法有一些潜在的注意事项:
- 如果每个资源有很多(即 - 数千)修订,则它无法很好地扩展。事实上,文档中所有集合的复杂对象限制为 3000 个。
- 要添加新修订,您必须 read-modify-write 整个修订集合,因为 Azure 搜索不支持 intra-collection 合并。
- 如果查询的主要单位确实是修订而不是资源,那么将修订建模为文档更为自然。但是,根据您需要的查询模式,您始终可以拥有多个索引。
另一种方法是添加一个布尔字段,如 IsLatestVersion
,但是当您向索引添加新修订时,您需要将先前修订的标志设置为 false。上面使用复杂类型的方法可能会更直接。