Azure 认知搜索 (已停用) 的Visual Studio Code扩展

Azure 认知搜索 的 Visual Studio Code 扩展(以前为预览版)未进入正式版,现已于 2022 年 11 月 1 日停用。

尽管 扩展在 Azure 市场 中不再可用,但代码在 中https://github.com/microsoft/vscode-azurecognitivesearch是开源的。 可以克隆和修改该工具供自己使用。

如果使用的是扩展,本文介绍如何使用 Azure 认知搜索 REST API 以交互方式构建 REST API 请求。

先决条件

使用扩展需要以下服务和工具

安装扩展

请参阅 Github 上的自述文件

连接到订阅

启动 Visual Studio COde。

选择“登录到 Azure...”然后登录到 Azure 帐户。

应会看到你的订阅。 在以下屏幕截图中,订阅名称为“Visual Studio Enterprise”并包含一个名为“azsearch-service”的搜索服务。

VS Code Azure 订阅

若要限制显示的订阅,请打开命令面板(Ctrl+Shift+P 或 Cmd+Shift+P),搜索 Azure 或选择订阅 。 还有一些命令可用于登录和注销 Azure 帐户。

展开搜索服务时,你将看到每个认知搜索项的树项:索引、数据源、索引器、技能集、同义词映射和别名。

VS Code Azure 搜索树

可以扩展这些树项以显示搜索服务中的资源。

1 - 创建索引

若要创建索引,请使用 创建索引 REST API

使用 VS Code 扩展时,只需要考虑请求的正文。 在本快速入门中,我们提供了一个示例索引定义和相应的文档。

索引定义

以下索引定义是虚构酒店的示例架构。

fields 集合定义搜索索引中文档的结构。 每个字段都有一个数据类型和多个其他属性,这些属性决定了如何使用该字段。

{
    "name": "hotels-quickstart",
    "fields": [
        {
            "name": "HotelId",
            "type": "Edm.String",
            "key": true,
            "filterable": true
        },
        {
            "name": "HotelName",
            "type": "Edm.String",
            "searchable": true,
            "filterable": false,
            "sortable": true,
            "facetable": false
        },
        {
            "name": "Description",
            "type": "Edm.String",
            "searchable": true,
            "filterable": false,
            "sortable": false,
            "facetable": false,
            "analyzer": "en.lucene"
        },
        {
            "name": "Description_fr",
            "type": "Edm.String",
            "searchable": true,
            "filterable": false,
            "sortable": false,
            "facetable": false,
            "analyzer": "fr.lucene"
        },
        {
            "name": "Category",
            "type": "Edm.String",
            "searchable": true,
            "filterable": true,
            "sortable": true,
            "facetable": true
        },
        {
            "name": "Tags",
            "type": "Collection(Edm.String)",
            "searchable": true,
            "filterable": true,
            "sortable": false,
            "facetable": true
        },
        {
            "name": "ParkingIncluded",
            "type": "Edm.Boolean",
            "filterable": true,
            "sortable": true,
            "facetable": true
        },
        {
            "name": "LastRenovationDate",
            "type": "Edm.DateTimeOffset",
            "filterable": true,
            "sortable": true,
            "facetable": true
        },
        {
            "name": "Rating",
            "type": "Edm.Double",
            "filterable": true,
            "sortable": true,
            "facetable": true
        },
        {
            "name": "Address",
            "type": "Edm.ComplexType",
            "fields": [
                {
                    "name": "StreetAddress",
                    "type": "Edm.String",
                    "filterable": false,
                    "sortable": false,
                    "facetable": false,
                    "searchable": true
                },
                {
                    "name": "City",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": true,
                    "sortable": true,
                    "facetable": true
                },
                {
                    "name": "StateProvince",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": true,
                    "sortable": true,
                    "facetable": true
                },
                {
                    "name": "PostalCode",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": true,
                    "sortable": true,
                    "facetable": true
                },
                {
                    "name": "Country",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": true,
                    "sortable": true,
                    "facetable": true
                }
            ]
        }
    ],
    "suggesters": [
        {
            "name": "sg",
            "searchMode": "analyzingInfixMatching",
            "sourceFields": [
                "HotelName"
            ]
        }
    ]
}

若要创建新索引,请右键单击“索引”然后选择“创建新索引” 。 将弹出一个名称类似于 indexes-new-28c972f661.azsindex 的编辑器。

将上面的索引定义粘贴到窗口中。 如果想要更新索引,请保存文件并在出现提示时选择“上传”。 此步骤创建索引并将其添加到左侧的树视图。

创建索引的 Gif

如果索引定义有问题,会看到一个错误消息,如下所示。

创建索引错误消息

如果发生错误,请修复问题并重新保存该文件。

2 - 加载文档

在 REST API 中,创建索引和填充索引是分开的步骤。 在 Azure 认知搜索中,索引包含所有可搜索的数据。 在此快速入门中,数据以 JSON 文档的形式提供。 本任务将使用添加、更新或删除文档 REST API

将新文档添加到索引:

  1. 展开创建的 hotels-quickstart 索引。 右键单击“文档”并选择“创建新文档” 。

    创建文档

  2. 应会看到一个已推断出索引架构的 JSON 编辑器。

    创建文档 JSON

  3. 粘贴下面的 JSON,并保存该文件。 系统将提示确认更改。 选择“上传”以保存更改。

    {
        "HotelId": "1",
        "HotelName": "Secret Point Motel",
        "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
        "Category": "Boutique",
        "Tags": [ "pool", "air conditioning", "concierge" ],
        "ParkingIncluded": false,
        "LastRenovationDate": "1970-01-18T00:00:00Z",
        "Rating": 3.60,
        "Address": {
            "StreetAddress": "677 5th Ave",
            "City": "New York",
            "StateProvince": "NY",
            "PostalCode": "10022",
            "Country": "USA"
        } 
    }
    
  4. 为其余三个文档重复此过程:

    文档 2:

    {
        "HotelId": "2",
        "HotelName": "Twin Dome Motel",
        "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
        "Category": "Boutique",
        "Tags": [ "pool", "free wifi", "concierge" ],
        "ParkingIncluded": false,
        "LastRenovationDate": "1979-02-18T00:00:00Z",
        "Rating": 3.60,
        "Address": {
            "StreetAddress": "140 University Town Center Dr",
            "City": "Sarasota",
            "StateProvince": "FL",
            "PostalCode": "34243",
            "Country": "USA"
        } 
    }
    

    文档 3:

    {
        "HotelId": "3",
        "HotelName": "Triple Landscape Hotel",
        "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
        "Category": "Resort and Spa",
        "Tags": [ "air conditioning", "bar", "continental breakfast" ],
        "ParkingIncluded": true,
        "LastRenovationDate": "2015-09-20T00:00:00Z",
        "Rating": 4.80,
        "Address": {
            "StreetAddress": "3393 Peachtree Rd",
            "City": "Atlanta",
            "StateProvince": "GA",
            "PostalCode": "30326",
            "Country": "USA"
        } 
    }
    

    文档 4:

    {
        "HotelId": "4",
        "HotelName": "Sublime Cliff Hotel",
        "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
        "Category": "Boutique",
        "Tags": [ "concierge", "view", "24-hour front desk service" ],
        "ParkingIncluded": true,
        "LastRenovationDate": "1960-02-06T00:00:00Z",
        "Rating": 4.60,
        "Address": {
            "StreetAddress": "7400 San Pedro Ave",
            "City": "San Antonio",
            "StateProvince": "TX",
            "PostalCode": "78216",
            "Country": "USA"
        }
    }
    

此时,你应该在“文档”部分看到所有四个文档。

上载所有文档后的状态

3 - 搜索索引

现在索引已包含内容,可以使用搜索文档 REST API 来发出查询了:

  1. 右键单击要搜索的索引,然后选择“搜索”。 此步骤会打开一个名称类似于 sandbox-b946dcda48.azs 的编辑器。

    扩展的搜索视图

  2. 会自动填充一个简单查询。 按“Ctrl+Alt+R”或“Cmd+Alt+R”以提交查询 。 你将在左侧的窗口中看到弹出的结果。

    扩展中的搜索结果

查询示例

尝试其他查询示例来了解语法。 下面有另外四个可尝试的查询。 可以将多个查询添加到同一个编辑器。 按“Ctrl+Alt+R”或“Cmd+Alt+R”时,光标所在的行决定了要提交的查询 。

并行查询和结果

在第一个查询中,只搜索特定字段 boutiqueselect。 最佳做法是通过 select 仅选择你需要的字段,因为回发不必要的数据可能会增加查询的延迟时间。 该查询还将 $count=true 设置为搜索结果的返回总数。

// Query example 1 - Search `boutique` with select and return count
search=boutique&$count=true&$select=HotelId,HotelName,Rating,Category

在下一个查询中,我们指定搜索词 wifi,还包括一个筛选器,以仅返回状态等于 'FL' 的结果。 还会按酒店的 Rating 对结果进行排序。

// Query example 2 - Search with filter, orderBy, select, and count
search=wifi&$filter=Address/StateProvince eq 'FL'&$select=HotelId,HotelName,Rating,Address/StateProvince&$orderby=Rating desc

接下来,使用 searchFields 参数将搜索限制为单个可搜索字段。 如果你知道自己只对某些字段中的匹配感兴趣,则很适合使用该选项来提高查询的效率。

// Query example 3 - Limit searchFields
search=sublime cliff&$select=HotelId,HotelName,Rating&searchFields=HotelName

查询中包含的另一个常见选项是 facets。 通过 facet,可在应用上构建筛选器,使用户能够轻松地了解可筛选出的值。

// Query example 4 - Take the top two results, and show only HotelName and Category in the results
search=*&$select=HotelId,HotelName,Rating&searchFields=HotelName&facet=Category

在门户中打开索引

若要在门户中查看搜索服务,请右键单击搜索服务的名称,然后选择“在门户中打开”。

清理资源

在自己的订阅中操作时,最好在项目结束时确定是否仍需要已创建的资源。 持续运行资源可能会产生费用。 可以逐个删除资源,也可以删除资源组以删除整个资源集。

可以使用左侧导航窗格中的“所有资源”或“资源组”链接 ,在门户中查找和管理资源。

如果使用的是免费服务,请记住只能设置三个索引、索引器和数据源。 可以在门户中删除单个项目,以不超出此限制。

后续步骤

现在,你已了解如何执行核心任务,接下来可以针对更高级的功能(例如索引器或设置向索引添加内容转换的 扩充管道 )继续执行其他 REST API 调用。 在下一步中,我们建议你访问以下链接: