Azure 搜索、筛选和按集合排序

Azure search, filter and order by collection

想要使用 azure search 在电子商务网站上进行搜索。我正在努力解决的部分是产品库存。每个产品都有为多个商店部门保存的库存。客户可以select一个或两个部门作为搜索过滤器。是否可以在特定部门按库存订购产品?是否可以过滤 stock > 0 的产品,例如 id 为 2 或 4 的部门?我知道 Collection(Edm.String) 类型的字段无法排序,但也许还有其他方法可以实现这种情况?一种方法是从搜索中获取产品,尽管有库存,然后在服务器端按库存(或过滤器库存> 0)订购,但它可能很慢且效率低下,尤其是对于大量产品。其他方法可能是在不同领域为每个部门节省库存,但目前我们有 200 个部门,而且这个数字可能更高。字段不会太多吗?

感谢任何建议

有几种方法可以解决这个问题,每种方法都有不同的权衡。

  1. 如果您将每个部门的库存建模为单独的字段,那么只需更改字段在 orderby 参数中出现的顺序,您就可以轻松地按不同部门进行排序。但是,Azure 搜索每个索引有 1000 个字段的限制(对于基本层,此限制下降到 100 个),因此这种方法可能不会随着您添加更多部门而扩展。
  2. 您可以有两个字符串集合字段,一个用于产品有货的所有部门,另一个长度相同,包含每个部门的库存数量。如果你这样建模,你可以制定一个按部门过滤产品的查询,但你不能按库存水平按部门过滤产品;您必须在您的应用程序代码中执行此操作。由于无法按集合排序,您还必须在应用程序代码中进行任何排序。
  3. 如果您有兴趣评估目前处于私人预览阶段的新 Complex Types feature,您可以将部门和库存级别建模为对象集合。这允许您按部门和库存级别过滤产品(例如,$filter=departments/any(d: (d/departmentId eq 2 or d/departmentId eq 4) and d/stock gt 0)),但您仍然需要在应用程序代码中进行订购。
  4. 可能最可靠的解决方案是根据库存水平专门针对 filtering/ordering 建立一个索引。不是每个产品一个文档,而是每个部门每个产品一个文档。那么该部门该产品的库存水平将只是一个整数字段,您可以轻松地对其进行排序和过滤。这有一个额外的好处,即不返回任何与过滤器不匹配的部门(方法 2 和 3 不能像这样过滤掉部门)。