你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
对 Azure Database for MySQL 中的数据编制索引
重要
根据补充使用条款,MySQL 支持当前以公共预览版提供。 请使用预览版 REST API(2020-06-30-preview 或更高版本)为内容编制索引。 目前不提供门户支持。
本文将介绍如何配置索引器,该索引器从 Azure Database for MySQL 导入内容,并使内容在 Azure 认知搜索中可供搜索。
本文对创建索引器进行了补充,其中包含 Azure DB for MySQL 中索引文件的特定信息。 它使用 REST API 演示所有索引器通用的工作流,该工作流包含三个部分:创建数据源、创建索引、创建索引器。 当配置为包含高水位线和软删除时,索引器将获取 MySQL 数据库的所有更改、上传和删除操作,并在搜索索引中反映这些更改。 提交“创建索引器”请求时,将提取数据。
先决条件
注册预览版以提供反馈,并获取有关你遇到的任何问题的帮助。
一个用于提供内容的表或视图。 主键是必需的。 如果使用视图,则它必须具有高使用标记列。
读取权限。 “完全访问权限”连接字符串包含用于授予内容访问权限的密钥,但如果使用的是 Azure 角色,请确保搜索服务托管标识对 MySQL 具有“读取者”权限。
一个 REST API 客户端,例如 Postman 或带有适用于 Azure 认知搜索的扩展的 Visual Studio Code,用于发送可创建数据源、索引和索引器的 REST 调用。
还可以使用用于 .Net 的 Azure SDK。 无法通过门户创建索引器,但可在创建索引器和数据源后,对其进行管理。
预览版限制
目前,如果所有行的日期或时间戳都一致,则更改跟踪和删除检测无法正常工作。 这是一个已知问题,将在预览版更新中得到解决。 在解决此问题之前,请勿将技能组添加到 MySQL 索引器。
该预览版不支持几何类型和 Blob。
如前所述,没有门户支持创建索引器,但一旦 MySQL 索引器和数据源存在,就可以在门户中对其进行管理。 例如,可以编辑定义,然后重置、运行或计划索引器。
定义数据源
数据源定义指定要编制索引的数据、凭据和用于标识数据更改的策略。 数据源定义为独立的资源,以便它可以被多个索引器使用。
创建或更新数据源明确说明了该定义。 创建数据源时,请确保使用预览版 REST API(2020-06-30-Preview 或更高版本)。
POST https://[search service name].search.windows.net/datasources?api-version=2020-06-30-Preview Content-Type: application/json api-key: [admin key] { "name" : "hotel-mysql-ds" "description" : "[Description of MySQL data source]", "type" : "mysql", "credentials" : { "connectionString" : "Server=[MySQLServerName].MySQL.database.azure.com; Port=3306; Database=[DatabaseName]; Uid=[UserName]; Pwd=[Password]; SslMode=Preferred;" }, "container" : { "name" : "[TableName]" }, "dataChangeDetectionPolicy" : { "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy", "highWaterMarkColumnName": "[HighWaterMarkColumn]" } }
将 "type" 设置为
"mysql"
(必需)。将 "credentials" 设置为 ADO.NET 连接字符串。 可以在 Azure 门户中 MySQL 的“连接字符串”页上找到连接字符串。
将 "container" 设置为表的名称。
如果数据经常变动,你希望索引器在后续运行时只获取新项和更新的项,可设置“dataChangeDetectionPolicy”。
如果要在删除源项时从搜索索引中删除搜索文档,可设置“dataDeletionDetectionPolicy”。
将搜索字段添加到索引
在搜索索引中,添加与表中的字段对应的搜索索引字段。
创建或更新索引明确说明了这些字段:
{
"name" : "hotels-mysql-ix",
"fields": [
{ "name": "ID", "type": "Edm.String", "key": true, "searchable": false },
{ "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false },
{ "name": "Category", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true },
{ "name": "City", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true },
{ "name": "Description", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false }
]
如果源表中的主键与文档键(在本例中为 "ID")匹配,则索引器将导入主键作为文档键。
映射数据类型
下表将 MySQL 数据库映射到认知搜索等效项。 有关详细信息,请参阅支持的数据类型(Azure 认知搜索)。
注意
预览不支持几何图形类型和 blob。
MySQL 数据类型 | 认知搜索字段类型 |
---|---|
bool , boolean |
Edm.Boolean、Edm.String |
tinyint , smallint , mediumint , int , integer , year |
Edm.Int32、Edm.Int64、Edm.String |
bigint |
Edm.Int64、Edm.String |
float , double , real |
Edm.Double、Edm.String |
date , datetime , timestamp |
Edm.DateTimeOffset、Edm.String |
char , varchar , tinytext , mediumtext , text , longtext , enum , set , time |
Edm.String |
无符号数值数据、serial、decimal、dec、bit、blob、binary、geometry | 空值 |
配置并运行 MySQL 索引器
创建索引和数据源后,便可以准备创建索引器。 索引器配置指定控制运行时行为的输入、参数和属性。
通过为索引器命名并引用数据源和目标索引来创建或更新索引器:
POST https://[search service name].search.windows.net/indexers?api-version=2020-06-30 { "name" : "hotels-mysql-idxr", "dataSourceName" : "hotels-mysql-ds", "targetIndexName" : "hotels-mysql-ix", "disabled": null, "schedule": null, "parameters": { "batchSize": null, "maxFailedItems": null, "maxFailedItemsPerBatch": null, "base64EncodeKeys": null, "configuration": { } }, "fieldMappings" : [ ], "encryptionKey": null }
如果字段名称或类型存在差异,或者需要在搜索索引中使用多个版本的源字段,请指定字段映射。
创建索引器后,它会自动运行。 可以将“已禁用”设置为 true 以防止这种情况。 若要控制索引器执行,请按需运行索引器或按计划运行索引器。
检查索引器状态
若要监视索引器状态和执行历史记录,请发送获取索引器状态请求:
GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]
响应包括状态和已处理的项数。 它应如以下示例所示:
{
"status":"running",
"lastResult": {
"status":"success",
"errorMessage":null,
"startTime":"2022-02-21T00:23:24.957Z",
"endTime":"2022-02-21T00:36:47.752Z",
"errors":[],
"itemsProcessed":1599501,
"itemsFailed":0,
"initialTrackingState":null,
"finalTrackingState":null
},
"executionHistory":
[
{
"status":"success",
"errorMessage":null,
"startTime":"2022-02-21T00:23:24.957Z",
"endTime":"2022-02-21T00:36:47.752Z",
"errors":[],
"itemsProcessed":1599501,
"itemsFailed":0,
"initialTrackingState":null,
"finalTrackingState":null
},
... earlier history items
]
}
执行历史记录包含最多 50 个最近完成的执行,它们按时间倒序排列,这样最新的执行最先显示。
为新行和已更改的行编制索引
索引器完全填充搜索索引后,建议运行后续的索引器,以便仅对数据库中的新行和已更改的行进行增量索引编制。
若要启用增量索引编制,请在数据源定义中设置“dataChangeDetectionPolicy”属性。 此属性告知索引器对数据使用哪种更改跟踪机制。
对于 Azure Database for MySQL 索引器,唯一支持的策略是 HighWaterMarkChangeDetectionPolicy
。
索引器的更改检测策略依赖于对行版本或行的上次更新日期和时间进行捕获的高使用标记列。 它通常是一个细化到足以满足高使用标记列要求的 DATE、DATETIME 或 TIMESTAMP 列。
在 MySQL 数据库中,高使用标记列必须满足以下要求:
- 所有数据插入都必须指定列值。
- 对某个项目的所有更新也会更改该列的值。
- 此列的值随每次插入或更新而增加。
- 具有以下 WHERE 和 ORDER BY 子句的查询可以高效执行:
WHERE [High Water Mark Column] > [Current High Water Mark Value] ORDER BY [High Water Mark Column]
以下示例演示具有更改检测策略的数据源定义:
POST https://[search service name].search.windows.net/datasources?api-version=2020-06-30-Preview
Content-Type: application/json
api-key: [admin key]
{
"name" : "[Data source name]",
"type" : "mysql",
"credentials" : { "connectionString" : "[connection string]" },
"container" : { "name" : "[table or view name]" },
"dataChangeDetectionPolicy" : {
"@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"highWaterMarkColumnName" : "[last_updated column name]"
}
}
重要
如果使用视图,则必须在索引器数据源中设置高使用标记策略。
如果源表在高使用标记列上没有索引,MySQL 索引器使用的查询可能会超时。特别是,当表中包含多个行时,ORDER BY [High Water Mark Column]
子句需要索引才能有效运行。
为已删除的行编制索引
从表或视图中删除行时,通常还需要从搜索索引中删除这些行。 但如果以物理方式从表中删除行,索引器将无法推断出不再存在的记录是否存在。 解决方法是使用“软删除”技术以逻辑方式删除行,无需从表中删除它们。 为此,可将列添加到表或视图,并使用该列将行标记为已删除。
鉴于有一列提供删除状态,因此可以配置索引器,以将删除状态设置为 true 的搜索文档删除。 支持此行为的配置属性是数据删除检测策略,该策略在数据源定义中进行指定,如下所示:
{
…,
"dataDeletionDetectionPolicy" : {
"@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName" : "[a column name]",
"softDeleteMarkerValue" : "[the value that indicates that a row is deleted]"
}
}
“softDeleteMarkerValue”必须是字符串。 例如,如果有一个整数列(使用值 1 标记删除的行),则使用 "1"
。 如果有一个 BIT 列用布尔值 true 标记了删除的行,请使用字符串字面量 True
或 true
(不区分大小写)。