【问题标题】:Azure Search: Order by dynamic dataAzure 搜索:按动态数据排序
【发布时间】:2017-11-15 10:36:11
【问题描述】:

我有一个 Azure 搜索索引,它由可以在多个区域“出现”任意次数的文档组成。例如,Document1Region1 中出现 5 次,在 Region2 中出现 20 次。 Document2Region1 中出现 54 次,在 Region3 中出现 10 次。 Document3Region3 中出现了 10 次。我们希望使用 Azure 搜索进行搜索和建议,但顺序基于区域的出现次数。例如,从Region1 中的用户搜索Document 应按Document2Document1Document3 的顺序返回,因为Document2 在该区域出现54 次,而Document1 出现5 次,并且Document3 没有。

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

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

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

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    tl;dr - 根据我的一些假设,可能会有适合您的解决方案。请继续阅读,如果可能,请尝试围绕我的假设提供一些验证,以便我给出更好的答案(如果存在这样的答案)。

    很遗憾,Azure 搜索没有针对您的方案的现成方法。但是可能有一种解决方法 - 不是区域集合类似于 ['Region1|5', 'Region2|20'],而是您可以尝试构造文档,使其看起来像 ['Region1', 'Region1',...., 'Region2', 'Region2', ...](也就是说,使集合包含 n Region1 的 em> 元素和 Region2m 元素,在您的情况下 n = 5 和 m = 10。

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

    这种方法可以通过两种方式帮助您:

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

    另外,仅供参考,我建议您查看scoring profiles feature 尤其是 tag 函数,看看它是否对你有用。

    【讨论】:

    • 是的,有数十万个区域,因此每个区域一列是不可行的。拥有 X 次区域会比另一个包含 X - N 次区域的文档得分更高吗?这些也是简化的情况,区域数量可能非常大,以数千计。这会影响性能吗?
    • 很遗憾,这里有一些问题: 1. 您可能会遇到我们为服务设置的其他限制。即围绕有效载荷大小。如果您访问:docs.microsoft.com/en-us/rest/api/searchservice/…,您会注意到我们将有效负载大小限制为 16MB,即使集合中的元素数量没有理论上的限制。 2. 如果您要索引的文档来自 blob 存储,我们可能会截断它并只获取前几 MB(在这种情况下我们会发出警告)
    • 我想说试试这个方法,看看它是否能很好地满足我们的服务负载限制。如果是这样,索引数据可能需要更长的时间,但理论上搜索/查询性能应该不会受到影响,并且您应该获得您所指示的所需评分。这是 Azure 搜索/全文搜索的一个非常典型的用例,这就是为什么我们目前没有更好的解决方案。
    • 在我的 POC 方法 2 中,搜索效果很好,但不适用于建议,因为我们似乎不能有复杂的术语。有人建议简单地使用 Search 而不是 Suggestion 来完成同样的事情,但这样做我会失去什么吗?
    • 我不完全了解您的建议方案?我以为我们只是在谈论搜索。您能否更详细地描述一下这个场景是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多