【问题标题】:Creating an efficient indexer for my Azure Search Service为我的 Azure 搜索服务创建高效的索引器
【发布时间】:2020-06-03 02:49:31
【问题描述】:

我的数据源不能是单个表,因为我需要跨越 6 个表的数据。为此,我创建了一个在这些表上进行连接的视图。 当我使用这个视图作为数据源时,索引需要很多时间并且超时。我尝试将超时时间增加到 40 分钟,并提出了另一项更改建议:

“disableOrderByHighWaterMarkColumn”:真

它超时了。我还设置了批量大小:1000。这次它填充了索引,但在几个小时后失败,说“连接丢失”。并“感谢”禁用OrderByHighWaterMarkColumn,如果我再次重新运行索引器,它将再次处理所有行。

我的问题是解决这个问题的最佳方法是什么。

后续问题:由于我依赖于视图,因此我无法进行自动更改跟踪。我正在使用高水印列 (LastUpdatedTime) 来跟踪我的视图中的更改。我只想在我的索引中保留 6 个月的数据,所以我不确定在使用 View 时如何做到这一点。我的视图中已经有“where CreateDateTime > dateadd(month, -6, getdate())”子句,但这不会使 Indexer 从索引中删除“out-of-time-window”行(文档)。我怎样才能在这里实现我的目标? 我是否应该编写一个处理器任务来定期使用 C# SDK 查询所有文档并根据日期删除文档?

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    很抱歉听到 Azure SQL 数据库索引器给您带来麻烦。我注意到您的问题中有几件事在 SQL 性能方面可能值得考虑:

    我的数据源不能是单个表,因为我需要跨越 6 个表的数据。为此,我创建了一个在这些表上进行连接的视图。当我将此视图用作数据源时,索引需要很多时间并且会超时。

    值得查看query performance troubleshooting guide 并找出导致问题的 Azure SQL 数据库中究竟发生了什么。假设您要使用更改跟踪支持,索引器对 SQL 数据库使用的默认查询如下所示: SELECT * FROM c WHERE hwm_column > @hwmvalue ORDER BY hwm_column 当 hwm_column 上没有索引或计算 hwm_column 时,我们经常在这里看到性能问题。你可以阅读更多关于issues with the high water mark column here的信息。

    我尝试将超时时间增加到 40 分钟,并提出了另一项更改建议:“disableOrderByHighWaterMarkColumn”:true 它已超时。我还设置了批量大小:1000。这次它填充了索引,但在几个小时后失败,说“连接丢失”。并“感谢”禁用OrderByHighWaterMarkColumn,如果我再次重新运行索引器,它将再次处理所有行。

    disableOrderByHighWaterMarkColumn 似乎不适用于您的场景,所以我同意您不应该设置它。减少批量大小似乎产生了积极的影响,我会考虑使用上面引用的故障排除指南来衡量性能提升

    后续问题:由于我依赖于视图,因此我无法进行自动更改跟踪。我正在使用高水印列 (LastUpdatedTime) 来跟踪我的视图中的更改。我只想在我的索引中保留 6 个月的数据,所以我不确定在使用 View 时如何做到这一点。我的视图中已经有“where CreateDateTime > dateadd(month, -6, getdate())”子句,但这不会使 Indexer 从索引中删除“out-of-time-window”行(文档)。我怎样才能在这里实现我的目标?我是否应该编写一个处理器任务来定期使用 C# SDK 查询所有文档并根据日期删除文档?

    我会考虑添加soft delete policy,而不是过滤掉超过 6 个月的数据。这里的挑战是索引器需要选择应该删除的行。完成此操作的最简单方法可能是更新您的应用程序逻辑以向您的视图添加一个新列,指示应删除该行。一旦此列的值发生更改,LastUpdatedTime 也应更新,以便在下一个索引器查询中显示。 你可以编写自己的处理器任务,但在 Azure 认知搜索中查询所有文档并对其进行分页可能会对搜索性能产生负面影响。我建议先尝试让它与您的索引器一起使用。

    【讨论】:

    • 感谢马修的回复!
    • 为什么 Azure 搜索会执行像 select *... 这样的查询。这是一个非常繁重的查询,因为它要求加载所有表。不能以分页方式加载行吗?我不认为 BatchSize 对查询本身有任何影响。我将尝试在我的高水印列上创建一个索引并检查性能。谢谢你的建议!如果我删除 disableOrderByHighWaterMarkColumn = true,那么它总是超时。
    • 你的意思是我应该定期更新列,如果行的 CreateDateTime 超过 6 个月,则将其标记为删除?如果我删除 6 个月的窗口,查询会变得更大。实际上,无论如何,视图在我的团队中是一种不推荐的获取数据的方式。我被要求使用 API 与数据库交互,而不是直接使用视图。这就是为什么我的下一步是使用 SDK 创建和维护索引。
    • Azure 搜索确实以分页方式加载行,它执行 select * 并在游标中移动。对于软删除策略,如果 CreateDateTime 超过 6 个月,我认为您标记删除的想法是正确的。如果您的团队建议使用 api 与数据库交互,另一种选择是创建一个平面表,其中包含您的数据的非规范化表示,该表示将包含在视图中。这样您就可以使用集成的更改跟踪并避免您遇到的一些高水位标记问题
    • 嘿马修,添加软删除列对我来说看起来很麻烦。我将不得不摆脱 6 个月的窗口,使我的视野更大。我还尝试按照您的建议在 LastUpdatedTime 上创建索引,但它引发了错误,因为我有 6 个月的条件:The function 'getdate' yields nondeterministic results. Use a deterministic system function, or modify the user-defined function to return deterministic results
    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 2020-03-03
    • 2023-03-11
    • 1970-01-01
    • 2021-07-24
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多