Azure搜索,过滤和按集合排序

时间:2018-02-13 16:46:01

标签: azure-search

想在电子商务网站上使用azure搜索进行搜索。我挣扎的部分是产品库存。每个产品都有为几个商店部门保存的库存。客户可以选择一个或两个部门作为搜索过滤器。是否可以通过特定部门的库存订购产品?并且可以过滤具有库存>的产品。 0例如id为2或4的部门?我知道Collection(Edm.String)类型的字段不能排序,但是可能有其他方法来实现这种情况吗?一种方法是从搜索中采用所有过滤器的产品,尽管是库存,然后在服务器端按库存(或过滤器库存> 0)订购,但它可能是缓慢且低效的,特别是对于大型产品组。其他方法可能是在单独的领域为每个部门节省库存,但目前我们有200个部门,而且数量可能更高。它不是太多的领域吗?

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

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

  1. 如果您将每个部门的库存建模为单独的字段,则只需更改字段在orderby参数中的显示顺序,您就可以轻松地按不同部门进行订购。但是,Azure Search的每个索引限制为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. 可能最强大的解决方案是拥有一个专门用于按库存水平过滤/排序的索引。每个产品每个产品只有一个文档,而不是每个产品一个文档。那么该部门中该产品的库存水平只是一个整数字段,您可以轻松地对其进行排序和过滤。这有额外的好处,即不返回任何与过滤器不匹配的部门(方法2和3不能过滤掉这样的部门)。