【问题标题】:azure search index/indexer not indexing new data天蓝色搜索索引/索引器未索引新数据
【发布时间】:2017-12-15 14:34:42
【问题描述】:

小故事: 我正在使用 azure 搜索服务,看起来它没有索引添加到我的视图中的新行(数据源指向视图)。

长篇大论: 我有一个视图,它是从我的数据库中的许多表中创建的。我创建了一个指向该视图的数据源。该视图有很多列,此处相关的是 2:Id 和 ChangeIndicator。更改指示符 (int) 具有计算值,该值是对用于构建视图的表中更改的一些值求和的结果。 我定义了一个索引,映射到我的数据源和一个索引器。索引器正确填充索引(第一次),它看到我视图中的所有行并正确索引数据(据我检查)。

问题是当我在视图中添加新行时 - 这些行没有被索引。

我使用 API 调用创建数据源、索引和索引器。

数据源是这样创建的:

{
    "name": "cs5datasource",
    "description": "Data source for cs search",
    "type": "azuresql",
    "credentials": { "connectionString" : "XXX - Connection string - XXX" },
    "container": {"name": "UserDataAggregatedView"},
    "dataChangeDetectionPolicy": {
        "@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",  
        "highWaterMarkColumnName" : "ChangeIndicator" 
    }
}

索引是这样创建的:

{
    "name": "cs5indexer",
    "description": "Indexer service",
    "dataSourceName": "cs5datasource",
    "targetIndexName": "cs5index",
    "schedule": {"interval" : "PT5M", "startTime" : "2017-06-24T22:00:00Z"}
}

添加新行(未编入索引的行)后,如果我删除索引器并再次创建它,则视图已正确编入索引。似乎问题是检测新行。添加的新行是有效的,索引过程不会产生错误。

我需要一种将新添加的行索引到我的视图的方法,以及一种从索引中删除已删除行的方法。如何做到这一点?

谢谢。

后期编辑: 新添加的行没有被索引。 我添加的新行如下所示:

Id |   name   | lang  |    proffesion   | changeIndicator
26 | test_011 |  en   | history teacher |    49536867 

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    您视图中的changeIndicator 列可能不适合作为高水位线列。高水位标记列应针对每个新的或更新的行单调增加;我们建议使用rowversion 列进行更改跟踪。

    来自Capturing new, changed, and deleted rows

    如果您的表或视图包含的列 符合以下条件:

    • 所有插入都为列指定了一个值。
    • 对项目的所有更新 也改变列的值。
    • 此列的值 随着每次插入或更新而增加。
    • 具有以下 WHERE 的查询 和 ORDER BY 子句可以高效执行:WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]

    要捕获已删除的行,请阅读Connecting Azure SQL Database to Azure Search using indexers 中的Soft Delete Column Deletion Detection policy 部分。

    【讨论】:

    • 感谢您的回答。我仍然在索引新行时遇到问题。当我添加一个新行时,它有一个 [High Water Mark Column],带有一个正整数值。但它没有被索引。只有当我删除索引器并重新创建它时,新添加的行才会被索引。您对如何修复/调试此问题有任何建议吗?
    • 请仔细阅读上面的链接文章。列值应随着每次插入或更新而增加,而不仅仅是“正整数值”。我们建议对该列使用 rowversion 数据类型。此外,视图不需要为所有字段使用非空值 - 唯一必须为非空的字段是主键和高水位标记列。
    • UPDATE 有效但 INSERT 没有使我怀疑您的插入没有使用递增的高水位标记列值这一事实。一旦获得,我们强烈建议使用 rowversion 数据类型的列作为高水位标记列。您使用的是 rowversion 数据类型吗?
    • 此外,在调试此类问题时,您可以使用 Get Indexer Status API (docs.microsoft.com/en-us/rest/api/searchservice/…) 查看每次运行期间索引器处理的高水位线范围。当您尝试不同的选项时,您可能还会发现 Reset Indexer API 很有用 (docs.microsoft.com/en-us/rest/api/searchservice/reset-indexer)
    • 看起来当您插入新行时,您需要使用适当的 ModifyTime 时间戳。此外,请检查您的逻辑,了解如何在视图中处理 ModifyTime 值。我不确定对这些值求和是否必要或适当。如果您在 JOINing 多行时选择正确的值,则 MAX(ModifyTime1, ModifyTime2) 可能更合适。正如我已经描述了高水位标记列应遵循的所有规则,我将让您找出适合您视图的架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2018-04-09
    • 2021-02-12
    • 2021-01-29
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多