Azure 搜索:按动态数据排序
Azure Search: Order by dynamic data
我有一个由文档组成的 Azure 搜索索引,可以在多个区域中 "occur" 任意次数。例如 Document1
在 Region1
中出现 5 次,在 Region2
中出现 20 次。 Document2
在 Region1
中出现了 54 次,在 Region3
中出现了 10 次。 Document3
在 Region3
中出现了 10 次。我们想使用 Azure 搜索进行搜索和建议,但顺序基于某个区域的出现次数。例如,从 Region1
中的用户搜索 Document
应该按 Document2
、Document1
、Document3
的顺序 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 元素和 Region2
的 m 元素,在你的情况下 n = 5 和 m = 10.
那么您应该能够使用用户来源的 区域 进行搜索,我相信结果应该根据文档的集合列(regions
) 包含特定查询区域的更多出现。
这种方法可以在两个方面帮助您:
- 您可以尝试将每个区域添加为搜索索引中的一列,并使用一些查询来获得您想要的结果。但是,由于您提到可能有 数十万 个这样的区域,它可能不适用于我们的 service limits。但是,如果不是这种情况,我强烈建议将每个区域添加为一列,这样您就可以 query/order 按列值。
- 通过复制字符串方法,您可以拥有任意大的集合,因为我相信 Azure 搜索对集合中的元素数量没有任何限制。另外这里的好处是,如果您的文档将有稀疏的区域(即,您可能有 100 个或 1000 个区域,但任何给定的文档只会枚举很少的区域),您应该能够实现您想要的.但是,如果不是这种情况,这种方法可能不是超级 nice/efficient,甚至可能会让您难以管理。
此外,仅供参考,我建议您查看 scoring profiles feature
尤其是 tag
功能,看看它是否对您有用。
我有一个由文档组成的 Azure 搜索索引,可以在多个区域中 "occur" 任意次数。例如 Document1
在 Region1
中出现 5 次,在 Region2
中出现 20 次。 Document2
在 Region1
中出现了 54 次,在 Region3
中出现了 10 次。 Document3
在 Region3
中出现了 10 次。我们想使用 Azure 搜索进行搜索和建议,但顺序基于某个区域的出现次数。例如,从 Region1
中的用户搜索 Document
应该按 Document2
、Document1
、Document3
的顺序 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 元素和 Region2
的 m 元素,在你的情况下 n = 5 和 m = 10.
那么您应该能够使用用户来源的 区域 进行搜索,我相信结果应该根据文档的集合列(regions
) 包含特定查询区域的更多出现。
这种方法可以在两个方面帮助您:
- 您可以尝试将每个区域添加为搜索索引中的一列,并使用一些查询来获得您想要的结果。但是,由于您提到可能有 数十万 个这样的区域,它可能不适用于我们的 service limits。但是,如果不是这种情况,我强烈建议将每个区域添加为一列,这样您就可以 query/order 按列值。
- 通过复制字符串方法,您可以拥有任意大的集合,因为我相信 Azure 搜索对集合中的元素数量没有任何限制。另外这里的好处是,如果您的文档将有稀疏的区域(即,您可能有 100 个或 1000 个区域,但任何给定的文档只会枚举很少的区域),您应该能够实现您想要的.但是,如果不是这种情况,这种方法可能不是超级 nice/efficient,甚至可能会让您难以管理。
此外,仅供参考,我建议您查看 scoring profiles feature
尤其是 tag
功能,看看它是否对您有用。