【问题标题】:Azure Search - database table is 2 million records but Azure Search index is 9 millionAzure 搜索 - 数据库表是 200 万条记录,但 Azure 搜索索引是 900 万条记录
【发布时间】:2017-06-01 02:45:18
【问题描述】:

我们的 SQL Server 数据库表包含大约 200 万条记录。我们拥有的从中导入的 Azure 搜索索引现在多达 950 万个文档。我们的索引器设置为每 24 小时运行一次。我们已在我们的数据库中开启更改跟踪。我们需要知道如何正确配置索引器,使其仅每 24 小时导入一次新记录。

我想知道问题是否出在我们的数据库如何写入记录:每 24 小时从网络收集所有 200 万条记录并写入临时表。然后存储过程将临时表中的数据与主数据表进行比较。如果某个 Source ID 的记录在 staging table 和 master table 之间匹配,则 staging table 记录将替换 master table 中的那些记录,甚至是相同的记录。 master table 中的记录暂存表中不存在的源 ID 将被单独保留。因此,即使写入主数据表的大多数记录只是替换现有的相同数据,Azure 搜索索引器是否必须将这些记录视为新记录?

在任何给定时间,如果我们的数据库只有 200 万条记录,那么 Azure 搜索索引应该只有 200 万条文档。但是它继续添加文档,似乎基于上述内容,这是我们需要知道如何解决的问题。

编辑:我注意到“软删除策略”的选项。这对我们有帮助吗,因为它还会删除索引中与数据库中已被替换的记录相对应的文档?

编辑 #2:我已在此处上传了一个 Excel 电子表格,它描绘了我试图解释的流程,以防它有助于可视化它:https://dl.dropboxusercontent.com/u/8477791/v4AzureSearchIndexFlow.xlsx

【问题讨论】:

  • 在 Azure 搜索的索引定义中,您是否将 SQL 数据库中的唯一 ID 字段标记为键?假设 ID 保持不变,这应该使 Azure 搜索只更新文档而不是插入新文档。 “软删除”选项更多的是关于您何时实际删除记录。
  • 是的,key 是一个具有唯一 id 的字段。问题是这些替换记录为这些记录创建了一个新的唯一 ID(即使所有其他数据与被替换的数据相同),因此 Azure 搜索索引将这些记录视为新记录。但我的理解是,通过为数据库打开更改跟踪并指示水印列,索引器应该能够确定哪些是新的,哪些不是。
  • 感谢您的澄清。您需要告诉 Azure 搜索使用数据库更改跟踪,您这样做了吗?见docs.microsoft.com/en-us/azure/search/…。当然,这只适用于任何新内容,因此您必须重新索引所有内容。
  • 弗兰斯,感谢您迄今为止的帖子。我已经在 Azure 门户中的数据源下选中了“跟踪更改”复选框。这与发布链接中显示的 dataChangeDetectionPolicy 不一样吗?
  • 我怀疑您可能需要删除索引并重新创建它...

标签: azure azure-cognitive-search


【解决方案1】:

新文档不断累积的事实与更改检测或删除检测无关。问题是您的源行在更改时会获得新的 ID。

Azure 搜索仅基于索引键字段的值来确定文档标识。更改跟踪是关于从数据源读取的内容;它与该数据的索引方式无关。唯一的因素是每个文档的 ID。具有匹配 ID 的文档将被更新,而不在索引中的 ID 将导致上传新文档。

一种可能的解决方法是使用 SQL 表的不同列作为文档键,但这仅在以下情况下有效

  1. 存在这样一列实际上跨行是唯一的,并且
  2. 列的值不会随着行中数据的变化而变化。

【讨论】:

  • 补充布鲁斯的答案:你能让你的搜索索引的键字段与 SQL 表的主键字段相同吗?这将确保当您更新表中的一行时,相应的搜索文档将被更新而不是重复。
  • 抱歉,我上面对我们流程的解释可能不清楚。没有“更新”记录。写入我们数据库的每一条数据都是一条新记录。添加到我们数据库中的每条记录都会获得一个新密钥。索引的键字段已经是那个主键字段。我认为问题在于 Azure 搜索索引没有删除与每 24 小时删除(和替换)的记录相对应的文档。所以 2 个问题:1. 如果这与 SQL 集成更改检测无关,它究竟做了什么? 2. 除非有任何其他解决方案,
  • ... 是否可以自动每天重建索引?只要可以在不更改索引名称的情况下完成,这方面的任何方案都可以工作。
  • 先生们,请查看我添加到主帖中的 Excel 图表 - 它可能有助于可视化我试图表达的流程。
  • @Stpete111 我们了解您所描述的流程。不幸的是,它与索引器的工作方式根本不一致。如果无法维护键的值,则索引中总是会出现新文档,因为键的值是 Azure 搜索决定是索引新文档还是更新现有文档的方式。更改检测是关于自上次索引器运行以来数据库中发生的更改,它基于时间戳(用于高水位线策略)或行版本(用于 SQL 集成更改跟踪)。同样,删除政策也无济于事……
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2011-11-29
相关资源
最近更新 更多