Azure 搜索:按动态数据排序

Azure Search: Order by dynamic data

我有一个由文档组成的 Azure 搜索索引,可以在多个区域中 "occur" 任意次数。例如 Document1Region1 中出现 5 次,在 Region2 中出现 20 次。 Document2Region1 中出现了 54 次,在 Region3 中出现了 10 次。 Document3Region3 中出现了 10 次。我们想使用 Azure 搜索进行搜索和建议,但顺序基于某个区域的出现次数。例如,从 Region1 中的用户搜索 Document 应该按 Document2Document1Document3 的顺序 return,因为 Document2 在该地区出现了 54 次,而 Document1 出现了 5 次,Document3 出现了 none.

[
  { 'name': 'Document1', 'regions': ['Region1|5', 'Region2|20'] },
  { 'name': 'Document2', 'regions': ['Region1|54', 'Region3|10'] },
  { 'name': 'Document3', 'regions': ['Region3|10'] }
]

我很难弄清楚如何构建索引,或者是否可以使用 Azure 搜索。请注意,区域的数量可能有数十万个。我可以改变中心点的区域并改用地理空间函数,但我仍然不知道如何放置或查询数据。

构建索引的最佳方式是什么?如何使查询成为可能?

tl;dr - There might be a solution for you based on some assumptions I have. Please read on, and if possible try to provide some validations around my assumptions for me to give a better answer (if such an answer exists).

遗憾的是,Azure 搜索没有适用于您的场景的现成方法。然而,可能有一个变通办法 - 而不是像 ['Region1|5', 'Region2|20'] 这样的区域集合,您可以尝试构建文档,使其看起来像 ['Region1', 'Region1',...., 'Region2', 'Region2', ...](即,使集合包含 [= Region1 的 27=]n 元素和 Region2m 元素,在你的情况下 n = 5 和 m = 10.

那么您应该能够使用用户来源的 区域 进行搜索,我相信结果应该根据文档的集合列(regions) 包含特定查询区域的更多出现。

这种方法可以在两个方面帮助您:

  1. 您可以尝试将每个区域添加为搜索索引中的一列,并使用一些查询来获得您想要的结果。但是,由于您提到可能有 数十万 个这样的区域,它可能不适用于我们的 service limits。但是,如果不是这种情况,我强烈建议将每个区域添加为一列,这样您就可以 query/order 按列值。
  2. 通过复制字符串方法,您可以拥有任意大的集合,因为我相信 Azure 搜索对集合中的元素数量没有任何限制。另外这里的好处是,如果您的文档将有稀疏的区域(即,您可能有 100 个或 1000 个区域,但任何给定的文档只会枚举很少的区域),您应该能够实现您想要的.但是,如果不是这种情况,这种方法可能不是超级 nice/efficient,甚至可能会让您难以管理。

此外,仅供参考,我建议您查看 scoring profiles feature 尤其是 tag 功能,看看它是否对您有用。