Samouczek: używanie platformy .NET i AI do wygenerowania zawartości z możliwością wyszukiwania z obiektów blob platformy AzureTutorial: Use .NET and AI to generate searchable content from Azure blobs

Jeśli w usłudze Azure Blob Storage znajduje się tekst lub obrazy bez struktury, potok wzbogacenia AI może wyodrębnić informacje i utworzyć nową zawartość dla wyszukiwania pełnotekstowego lub scenariuszy wyszukiwania w bazie wiedzy.If you have unstructured text or images in Azure Blob storage, an AI enrichment pipeline can extract information and create new content for full-text search or knowledge mining scenarios.

Niniejszy samouczek zawiera informacje na temat wykonywania następujących czynności:In this tutorial, you will learn how to:

  • Konfigurowanie środowiska programistycznegoSet up a development environment
  • Zdefiniuj potok, który używa OCR, wykrywania języka oraz rozpoznawania jednostek i fraz kluczy.Define a pipeline that uses OCR, language detection, and entity and key phrase recognition.
  • Wykonaj potok, aby wywoływać przekształcenia, i utworzyć i załadować indeks wyszukiwania.Execute the pipeline to invoke transformations, and to create and load a search index.
  • Eksplorowanie wyników przy użyciu wyszukiwania pełnotekstowego i zaawansowanej składni zapytań.Explore results using full text search and a rich query syntax.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem Otwórz bezpłatne konto .If you don't have an Azure subscription, open a free account before you begin.

OmówienieOverview

W tym samouczku do tworzenia źródła danych, indeksu, indeksatora i zestawu umiejętności jest Azure.Search.Doc stosowana Biblioteka uments klienta .This tutorial uses C# and the Azure.Search.Documents client library to create a data source, index, indexer, and skillset.

Indeksator nawiązuje połączenie z kontenerem obiektów BLOB określonym w obiekcie źródła danych i wysyła całą zawartość indeksowaną do istniejącego indeksu wyszukiwania.The indexer connects to a blob container that's specified in the data source object, and sends all indexed content to an existing search index.

Zestawu umiejętności jest dołączona do indeksatora.The skillset is attached to the indexer. Używa wbudowanej umiejętności firmy Microsoft do znajdowania i wyodrębniania informacji.It uses built-in skills from Microsoft to find and extract information. Kroki w potoku obejmują optyczne rozpoznawanie znaków (OCR) na obrazach, wykrywanie języka dla tekstu, wyodrębnianie kluczowych fraz i rozpoznawanie jednostek (organizacje).Steps in the pipeline include Optical Character Recognition (OCR) on images, language detection on text, key phrase extraction, and entity recognition (organizations). Nowe informacje tworzone przez potok są przechowywane w nowych polach w indeksie.New information created by the pipeline is stored in new fields in an index. Po wypełnieniu indeksu można użyć pól w zapytaniach, aspektach i filtrach.Once the index is populated, you can use the fields in queries, facets, and filters.

Wymagania wstępnePrerequisites

Uwaga

W tym samouczku możesz użyć bezpłatnej usługi wyszukiwania.You can use the free search service for this tutorial. Bezpłatna usługa wyszukiwania ogranicza do trzech indeksów, trzech indeksatorów i trzech źródeł danych.A free search service limits you to three indexes, three indexers, and three data sources. W ramach tego samouczka tworzony jest jeden element każdego z tych typów.This tutorial creates one of each. Przed rozpoczęciem upewnij się, że masz miejsce w usłudze, aby akceptować nowe zasoby.Before starting, make sure you have room on your service to accept the new resources.

Pobierz przykładowe daneDownload sample data

Przykładowe dane składają się z 14 plików typu zawartości mieszanej, który zostanie przekazany do usługi Azure Blob Storage w późniejszym kroku.The sample data consists of 14 files of mixed content type that you will upload to Azure Blob storage in a later step.

  1. Otwórz ten folder w usłudze OneDrive i w lewym górnym rogu, kliknij pozycję Pobierz , aby skopiować pliki do komputera.Open this OneDrive folder and on the top-left corner, click Download to copy the files to your computer.

  2. Kliknij prawym przyciskiem myszy plik zip i wybierz polecenie Wyodrębnij wszystko.Right-click the zip file and select Extract All. Istnieje 14 plików różnych typów.There are 14 files of various types. W tym ćwiczeniu należy użyć 7.You'll use 7 for this exercise.

Możesz również pobrać kod źródłowy dla tego samouczka.You can also download the source code for this tutorial. Kod źródłowy znajduje się w folderze samouczek — wzbogacanie/v11 w repozytorium Azure-Search-dotnet-Samples .Source code is in the tutorial-ai-enrichment/v11 folder in the azure-search-dotnet-samples repository.

1 — Tworzenie usług1 - Create services

Ten samouczek używa usługi Azure Wyszukiwanie poznawcze do indeksowania i zapytań, Cognitive Services w zapleczu do wzbogacania AI i usługi Azure Blob Storage, aby zapewnić dane.This tutorial uses Azure Cognitive Search for indexing and queries, Cognitive Services on the backend for AI enrichment, and Azure Blob storage to provide the data. Ten samouczek jest objęty bezpłatną alokacją 20 transakcji na indeksator dziennie na Cognitive Services, więc jedyne usługi, które należy utworzyć, to wyszukiwanie i magazynowanie.This tutorial stays under the free allocation of 20 transactions per indexer per day on Cognitive Services, so the only services you need to create are search and storage.

Jeśli to możliwe, Utwórz zarówno w tym samym regionie, jak i w grupie zasobów, co umożliwia bliskość i łatwość zarządzania.If possible, create both in the same region and resource group for proximity and manageability. W tym przypadku konto usługi Azure Storage może znajdować się w dowolnym regionie.In practice, your Azure Storage account can be in any region.

Rozpoczynanie pracy z usługą Azure StorageStart with Azure Storage

  1. Zaloguj się do Azure Portal i kliknij pozycję + Utwórz zasób.Sign in to the Azure portal and click + Create Resource.

  2. Wyszukaj konto magazynu i wybierz ofertę konta magazynu firmy Microsoft.Search for storage account and select Microsoft's Storage Account offering.

    Utwórz konto magazynuCreate Storage account

  3. Na karcie podstawowe wymagane są następujące elementy.In the Basics tab, the following items are required. Zaakceptuj wartości domyślne dla wszystkich innych elementów.Accept the defaults for everything else.

    • Grupa zasobów.Resource group. Wybierz istniejący lub Utwórz nowy, ale Użyj tej samej grupy dla wszystkich usług, aby można było zarządzać nimi zbiorczo.Select an existing one or create a new one, but use the same group for all services so that you can manage them collectively.

    • Nazwa konta magazynu.Storage account name. Jeśli uważasz, że może istnieć wiele zasobów tego samego typu, użyj nazwy, aby odróżnić według typu i regionu, na przykład blobstoragewestus.If you think you might have multiple resources of the same type, use the name to disambiguate by type and region, for example blobstoragewestus.

    • Lokalizacja.Location. Jeśli to możliwe, wybierz tę samą lokalizację, która jest używana dla usługi Azure Wyszukiwanie poznawcze i Cognitive Services.If possible, choose the same location used for Azure Cognitive Search and Cognitive Services. Pojedyncza lokalizacja unieważnia opłaty za przepustowość.A single location voids bandwidth charges.

    • Rodzaj konta.Account Kind. Wybierz wartość domyślną StorageV2 (ogólnego przeznaczenia w wersji 2).Choose the default, StorageV2 (general purpose v2).

  4. Kliknij przycisk Przegląd + Utwórz , aby utworzyć usługę.Click Review + Create to create the service.

  5. Po jego utworzeniu kliknij pozycję Przejdź do zasobu , aby otworzyć stronę przegląd.Once it's created, click Go to the resource to open the Overview page.

  6. Kliknij pozycję obiekty blob usługa.Click Blobs service.

  7. Kliknij pozycję + kontener , aby utworzyć kontener i nadaj mu nazwę koło zębate-Search-demonstracyjn.Click + Container to create a container and name it cog-search-demo.

  8. Wybierz pozycję koło zębate-Search-demonstracyjny , a następnie kliknij pozycję Przekaż , aby otworzyć folder, w którym zapisano pliki do pobrania.Select cog-search-demo and then click Upload to open the folder where you saved the download files. Zaznacz wszystkie czternaście plików i kliknij przycisk OK , aby przekazać.Select all fourteen files and click OK to upload.

    Przekaż pliki przykładoweUpload sample files

  9. Przed opuszczeniem usługi Azure Storage należy uzyskać parametry połączenia, aby można było sformułować połączenie w usłudze Azure Wyszukiwanie poznawcze.Before you leave Azure Storage, get a connection string so that you can formulate a connection in Azure Cognitive Search.

    1. Przejdź z powrotem do strony Przegląd Twojego konta magazynu (na przykład użyto blobstoragewestus ).Browse back to the Overview page of your storage account (we used blobstoragewestus as an example).

    2. W okienku nawigacji po lewej stronie wybierz pozycję klucze dostępu i skopiuj jeden z parametrów połączenia.In the left navigation pane, select Access keys and copy one of the connection strings.

    Ciąg połączenia jest adresem URL podobnym do poniższego przykładu:The connection string is a URL similar to the following example:

    DefaultEndpointsProtocol=https;AccountName=blobstoragewestus;AccountKey=<your account key>;EndpointSuffix=core.windows.net
    
  10. Zapisz parametry połączenia w Notatniku.Save the connection string to Notepad. Będzie ona potrzebna później podczas konfigurowania połączenia ze źródłem danych.You'll need it later when setting up the data source connection.

Cognitive ServicesCognitive Services

Wzbogacanie AI jest obsługiwane przez Cognitive Services, w tym analiza tekstu i przetwarzanie obrazów dla przetwarzania w języku naturalnym i obrazie.AI enrichment is backed by Cognitive Services, including Text Analytics and Computer Vision for natural language and image processing. Jeśli celem było ukończenie rzeczywistego prototypu lub projektu, w tym momencie należy zastanowić się, Cognitive Services (w tym samym regionie co usługa Azure Wyszukiwanie poznawcze), aby można było dołączyć go do operacji indeksowania.If your objective was to complete an actual prototype or project, you would at this point provision Cognitive Services (in the same region as Azure Cognitive Search) so that you can attach it to indexing operations.

W tym ćwiczeniu można jednak pominąć Inicjowanie obsługi zasobów, ponieważ usługa Azure Wyszukiwanie poznawcze może nawiązać połączenie Cognitive Services w tle i zapewnić 20 bezpłatnych transakcji dla indeksatora.For this exercise, however, you can skip resource provisioning because Azure Cognitive Search can connect to Cognitive Services behind the scenes and give you 20 free transactions per indexer run. Ponieważ w tym samouczku jest używanych 14 transakcji, wystarczające jest bezpłatne przydzielanie.Since this tutorial uses 14 transactions, the free allocation is sufficient. W przypadku większych projektów Zaplanuj obsługę Cognitive Services w warstwie płatność zgodnie z rzeczywistym użyciem.For larger projects, plan on provisioning Cognitive Services at the pay-as-you-go S0 tier. Aby uzyskać więcej informacji, zobacz Attach Cognitive Services.For more information, see Attach Cognitive Services.

Trzeci składnik to Wyszukiwanie poznawcze platformy Azure, który można utworzyć w portalu lub znaleźć istniejącą usługę wyszukiwania w ramach subskrypcji.The third component is Azure Cognitive Search, which you can create in the portal or find an existing search service in your subscription.

Aby ukończyć ten przewodnik, możesz skorzystać z warstwy Bezpłatna.You can use the Free tier to complete this walkthrough.

Aby można było korzystać z usługi Azure Wyszukiwanie poznawcze, wymagany jest adres URL usługi i klucz dostępu.To interact with your Azure Cognitive Search service you will need the service URL and an access key. Usługa wyszukiwania jest tworzona razem z usługą, więc jeśli do subskrypcji dodano Wyszukiwanie poznawcze platformy Azure, wykonaj następujące kroki, aby uzyskać niezbędne informacje:A search service is created with both, so if you added Azure Cognitive Search to your subscription, follow these steps to get the necessary information:

  1. Zaloguj się do Azure Portali na stronie Przegląd usługi wyszukiwania Uzyskaj adres URL.Sign in to the Azure portal, and in your search service Overview page, get the URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://mydemo.search.windows.net.An example endpoint might look like https://mydemo.search.windows.net.

  2. W obszarze Ustawienia > klucze skopiuj klucz administratora, aby uzyskać pełne prawa do usługi.In Settings > Keys, copy an admin key for full rights on the service. Istnieją dwa wymienne klucze administratora zapewniające ciągłość działania w przypadku, gdy trzeba ją wycofać.There are two interchangeable admin keys, provided for business continuity in case you need to roll one over. W przypadku żądań dotyczących dodawania, modyfikowania i usuwania obiektów można użyć klucza podstawowego lub pomocniczego.You can use either the primary or secondary key on requests for adding, modifying, and deleting objects.

    Pobierz również klucz zapytania.Get the query key as well. Najlepszym rozwiązaniem jest wydawanie żądań zapytań z dostępem tylko do odczytu.It's a best practice to issue query requests with read-only access.

    Pobieranie nazwy usługi i administratora oraz kluczy zapytań

Prawidłowy klucz ustanawia relację zaufania dla danego żądania między aplikacją wysyłającą żądanie i usługą, która je obsługuje.Having a valid key establishes trust, on a per request basis, between the application sending the request and the service that handles it.

2 — Konfigurowanie środowiska2 - Set up your environment

Zacznij od otwierania programu Visual Studio i tworzenia nowego projektu aplikacji konsolowego, który można uruchomić w środowisku .NET Core.Begin by opening Visual Studio and creating a new Console App project that can run on .NET Core.

Zainstaluj Azure.Search.DocumentsInstall Azure.Search.Documents

Zestaw Azure wyszukiwanie poznawcze .NET SDK składa się z biblioteki klienckiej, która umożliwia zarządzanie indeksami, źródłami danych, indeksatorami i umiejętności, a także przekazywaniem i zarządzaniem dokumentami oraz wykonywanie zapytań, bez konieczności zajmowania się szczegółowymi informacjami dotyczącymi protokołu HTTP i JSON.The Azure Cognitive Search .NET SDK consists of a client library that enables you to manage your indexes, data sources, indexers, and skillsets, as well as upload and manage documents and execute queries, all without having to deal with the details of HTTP and JSON. Ta Biblioteka kliencka jest dystrybuowana jako pakiet NuGet.This client library is distributed as a NuGet package.

W przypadku tego projektu Zainstaluj wersję 11 lub nowszą Azure.Search.Documents i najnowszą wersję programu Microsoft.Extensions.Configuration .For this project, install version 11 or later of the Azure.Search.Documents and the latest version of Microsoft.Extensions.Configuration.

  1. W programie Visual Studio wybierz kolejno pozycje Narzędzia > Menedżer pakietów NuGet > Zarządzanie pakietami NuGet dla rozwiązania...In Visual Studio, select Tools > NuGet Package Manager > Manage NuGet Packages for Solution...

  2. Przeglądaj w poszukiwaniu Azure.Search.Document.Browse for Azure.Search.Document.

  3. Wybierz najnowszą wersję, a następnie kliknij przycisk Instaluj.Select the latest version and then click Install.

  4. Powtórz poprzednie kroki, aby zainstalować Microsoft.Extensions.Configwersja i Microsoft.Extensions.Configuration.Js.Repeat the previous steps to install Microsoft.Extensions.Configuration and Microsoft.Extensions.Configuration.Json.

Dodaj informacje o połączeniu z usługąAdd service connection information

  1. Kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierz polecenie Dodaj > nowy element. ...Right-click on your project in the Solution Explorer and select Add > New Item... .

  2. Nazwij plik appsettings.json i wybierz pozycję Dodaj.Name the file appsettings.json and select Add.

  3. Dołącz ten plik do katalogu wyjściowego.Include this file in your output directory.

    1. Kliknij prawym przyciskiem myszy appsettings.json i wybierz pozycję Właściwości.Right-click on appsettings.json and select Properties.
    2. Zmień wartość w polu Kopiuj do katalogu wyjściowego na Kopiuj, jeśli nowszy.Change the value of Copy to Output Directory to Copy if newer.
  4. Skopiuj poniższy kod JSON do nowego pliku JSON.Copy the below JSON into your new JSON file.

    {
      "SearchServiceUri": "Put your search service URI here",
      "SearchServiceAdminApiKey": "Put your primary or secondary API key here",
      "SearchServiceQueryApiKey": "Put your query API key here",
      "AzureBlobConnectionString": "Put your Azure Blob connection string here",
    }
    

Dodaj usługę wyszukiwania i informacje o koncie usługi BLOB Storage.Add your search service and blob storage account information. Odwołaj te informacje można uzyskać, korzystając z kroków inicjowania obsługi usługi, wskazanych w poprzedniej sekcji.Recall that you can get this information from the service provisioning steps indicated in the previous section.

W polu SearchServiceUri wprowadź pełny adres URL.For SearchServiceUri, enter the full URL.

Dodaj przestrzenie nazwAdd namespaces

W programie Program.cs Dodaj następujące przestrzenie nazw.In Program.cs, add the following namespaces.

using Azure;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;

namespace EnrichwithAI

Tworzenie klientaCreate a client

Utwórz wystąpienie a SearchIndexClient i SearchIndexerClient poniżej Main .Create an instance of a SearchIndexClient and a SearchIndexerClient under Main.

public static void Main(string[] args)
{
    // Create service client
    IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
    IConfigurationRoot configuration = builder.Build();

    string searchServiceUri = configuration["SearchServiceUri"];
    string adminApiKey = configuration["SearchServiceAdminApiKey"];
    string cognitiveServicesKey = configuration["CognitiveServicesKey"];

    SearchIndexClient indexClient = new SearchIndexClient(new Uri(searchServiceUri), new AzureKeyCredential(adminApiKey));
    SearchIndexerClient indexerClient = new SearchIndexerClient(new Uri(searchServiceUri), new AzureKeyCredential(adminApiKey));
}

Uwaga

Klienci łączą się z usługą wyszukiwania.The clients connect to your search service. Aby uniknąć otwierania zbyt wielu połączeń, należy w miarę możliwości udostępnić pojedyncze wystąpienie w aplikacji.In order to avoid opening too many connections, you should try to share a single instance in your application if possible. Metody są bezpieczne dla wątków, aby umożliwić takie udostępnianie.The methods are thread-safe to enable such sharing.

Dodaj funkcję, aby wyjść z programu w trakcie awariiAdd function to exit the program during failure

Ten samouczek ma pomóc zrozumieć każdy krok potoku indeksowania.This tutorial is meant to help you understand each step of the indexing pipeline. W przypadku wystąpienia problemu krytycznego, który uniemożliwia programowi utworzenie źródła danych, zestawu umiejętności, indeksu lub indeksatora, program będzie wyprowadzał komunikat o błędzie i wyjść, aby można było zrozumieć i rozwiązać problem.If there is a critical issue that prevents the program from creating the data source, skillset, index, or indexer the program will output the error message and exit so that the issue can be understood and addressed.

Dodaj ExitProgram do, aby Main obsługiwać scenariusze, które wymagają zakończenia działania programu.Add ExitProgram to Main to handle scenarios that require the program to exit.

private static void ExitProgram(string message)
{
    Console.WriteLine("{0}", message);
    Console.WriteLine("Press any key to exit the program...");
    Console.ReadKey();
    Environment.Exit(0);
}

3 — Tworzenie potoku3 - Create the pipeline

W przypadku usługi Azure Wyszukiwanie poznawcze przetwarzanie AI odbywa się podczas indeksowania (lub pozyskiwania danych).In Azure Cognitive Search, AI processing occurs during indexing (or data ingestion). W tej części przewodnika utworzono cztery obiekty: Źródło danych, definicja indeksu, zestawu umiejętności, indeksator.This part of the walkthrough creates four objects: data source, index definition, skillset, indexer.

Krok 1. Tworzenie źródła danychStep 1: Create a data source

SearchIndexerClient ma DataSourceName Właściwość, którą można ustawić na SearchIndexerDataSourceConnection obiekt.SearchIndexerClient has a DataSourceName property that you can set to a SearchIndexerDataSourceConnection object. Ten obiekt zawiera wszystkie metody potrzebne do tworzenia, wyświetlania, aktualizowania lub usuwania źródeł danych Azure Wyszukiwanie poznawcze.This object provides all the methods you need to create, list, update, or delete Azure Cognitive Search data sources.

Utwórz nowe SearchIndexerDataSourceConnection wystąpienie, wywołując element indexerClient.CreateOrUpdateDataSourceConnection(dataSource) .Create a new SearchIndexerDataSourceConnection instance by calling indexerClient.CreateOrUpdateDataSourceConnection(dataSource). Poniższy kod tworzy źródło danych typu AzureBlob .The following code creates a data source of type AzureBlob.

private static SearchIndexerDataSourceConnection CreateOrUpdateDataSource(SearchIndexerClient indexerClient, IConfigurationRoot configuration)
{
    SearchIndexerDataSourceConnection dataSource = new SearchIndexerDataSourceConnection(
        name: "demodata",
        type: SearchIndexerDataSourceType.AzureBlob,
        connectionString: configuration["AzureBlobConnectionString"],
        container: new SearchIndexerDataContainer("cog-search-demo"))
    {
        Description = "Demo files to demonstrate cognitive search capabilities."
    };

    // The data source does not need to be deleted if it was already created
    // since we are using the CreateOrUpdate method
    try
    {
        indexerClient.CreateOrUpdateDataSourceConnection(dataSource);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Failed to create or update the data source\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without a data source");
    }

    return dataSource;
}

W przypadku pomyślnego żądania Metoda zwróci źródło danych, które zostało utworzone.For a successful request, the method will return the data source that was created. Jeśli wystąpi problem z żądaniem, na przykład nieprawidłowym parametrem, Metoda zgłosi wyjątek.If there is a problem with the request, such as an invalid parameter, the method will throw an exception.

Teraz Dodaj wiersz Main do wywołania CreateOrUpdateDataSource funkcji, która właśnie została dodana.Now add a line in Main to call the CreateOrUpdateDataSource function that you've just added.

// Create or Update the data source
Console.WriteLine("Creating or updating the data source...");
SearchIndexerDataSourceConnection dataSource = CreateOrUpdateDataSource(indexerClient, configuration);

Skompiluj i uruchom rozwiązanie.Build and run the solution. Ponieważ jest to Twoje pierwsze żądanie, sprawdź Azure Portal, aby potwierdzić, że źródło danych zostało utworzone w usłudze Azure Wyszukiwanie poznawcze.Since this is your first request, check the Azure portal to confirm the data source was created in Azure Cognitive Search. Na stronie Przegląd usługi wyszukiwania Sprawdź, czy lista źródeł danych ma nowy element.On the search service overview page, verify the Data Sources list has a new item. Może trzeba będzie zaczekać kilka minut na odświeżenie strony portalu.You might need to wait a few minutes for the portal page to refresh.

Kafelek źródła danych w portaluData sources tile in the portal

Krok 2. Tworzenie elementu zestawu umiejętnościStep 2: Create a skillset

W tej sekcji definiujesz zestaw kroków wzbogacania, które chcesz zastosować do danych.In this section, you define a set of enrichment steps that you want to apply to your data. Każdy krok wzbogacania jest nazywany umiejętnością i zestawem kroków wzbogacania, zestawu umiejętności.Each enrichment step is called a skill and the set of enrichment steps, a skillset. W tym samouczku są stosowane wbudowane umiejętności poznawcze dla zestawu umiejętności:This tutorial uses built-in cognitive skills for the skillset:

  • Optyczne rozpoznawanie znaków do rozpoznawania tekstu napisanego i odręcznego w plikach obrazów.Optical Character Recognition to recognize printed and handwritten text in image files.

  • Łączenie tekstu do konsolidowania tekstu z kolekcji pól w jedno pole.Text Merger to consolidate text from a collection of fields into a single field.

  • Wykrywanie języka — identyfikowanie języka zawartości.Language Detection to identify the content's language.

  • Dzielenie tekstu w celu podziału dużej zawartości na mniejsze fragmenty przed wywołaniem umiejętności wyodrębniania kluczowych fraz i umiejętności rozpoznawania jednostek.Text Split to break large content into smaller chunks before calling the key phrase extraction skill and the entity recognition skill. Wyodrębnianie kluczowych fraz i rozpoznawanie jednostek akceptuje dane wejściowe z 50 000 znaków lub mniej.Key phrase extraction and entity recognition accept inputs of 50,000 characters or less. Kilka przykładowych plików należy podzielić, aby zmieścić się w tym limicie.A few of the sample files need splitting up to fit within this limit.

  • Rozpoznawanie jednostek do wyodrębniania nazw organizacji z zawartości kontenera obiektów BLOB.Entity Recognition for extracting the names of organizations from content in the blob container.

  • Wyodrębnianie kluczowych fraz — określanie najczęściej występujących fraz kluczowych.Key Phrase Extraction to pull out the top key phrases.

Podczas wstępnego przetwarzania platforma Azure Wyszukiwanie poznawcze pęknięć każdy dokument w celu wyodrębnienia zawartości z różnych formatów plików.During initial processing, Azure Cognitive Search cracks each document to extract content from different file formats. Tekst pochodzący z pliku źródłowego jest umieszczany w wygenerowanym content polu, po jednym dla każdego dokumentu.Text originating in the source file is placed into a generated content field, one for each document. W związku z tym ustaw wartość wejściową, tak "/document/content" aby używała tego tekstu.As such, set the input as "/document/content" to use this text. Zawartość obrazu jest umieszczana w wygenerowanym normalized_images polu, określonym w zestawu umiejętności jako /document/normalized_images/* .Image content is placed into a generated normalized_images field, specified in a skillset as /document/normalized_images/*.

Dane wyjściowe można mapować na indeks i/lub używać ich jako danych wejściowych umiejętności podrzędnej — jak w przypadku kodu języka.Outputs can be mapped to an index, used as input to a downstream skill, or both as is the case with language code. W indeksie kod języka jest przydatny do filtrowania.In the index, a language code is useful for filtering. Kod języka jest używany jako dane wejściowe przez umiejętności analizy tekstu w celu określenia zasad podziału wyrazów przez reguły językowe.As an input, language code is used by text analysis skills to inform the linguistic rules around word breaking.

Aby uzyskać więcej podstawowych informacji na temat zestawów umiejętności, zobacz Jak zdefiniować zestaw umiejętności.For more information about skillset fundamentals, see How to define a skillset.

Umiejętność OCROCR skill

Umiejętność OCR wyodrębnia tekst z obrazów.The OCR skill extracts text from images. Ta umiejętność zakłada, że pole normalized_images istnieje.This skill assumes that a normalized_images field exists. Aby wygenerować to pole, w dalszej części samouczka ustawimy "imageAction" konfigurację w definicji indeksatora na "generateNormalizedImages" .To generate this field, later in the tutorial we'll set the "imageAction" configuration in the indexer definition to "generateNormalizedImages".

private static OcrSkill CreateOcrSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("image")
    {
        Source = "/document/normalized_images/*"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("text")
    {
        TargetName = "text"
    });

    OcrSkill ocrSkill = new OcrSkill(inputMappings, outputMappings)
    {
        Description = "Extract text (plain and structured) from image",
        Context = "/document/normalized_images/*",
        DefaultLanguageCode = OcrSkillLanguage.En,
        ShouldDetectOrientation = true
    };

    return ocrSkill;
}

Scal umiejętnośćMerge skill

W tej sekcji utworzysz umiejętność scalania , która scala pole zawartości dokumentu z tekstem wyprodukowanym przez umiejętność OCR.In this section, you'll create a Merge skill that merges the document content field with the text that was produced by the OCR skill.

private static MergeSkill CreateMergeSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/content"
    });
    inputMappings.Add(new InputFieldMappingEntry("itemsToInsert")
    {
        Source = "/document/normalized_images/*/text"
    });
    inputMappings.Add(new InputFieldMappingEntry("offsets")
    {
        Source = "/document/normalized_images/*/contentOffset"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("mergedText")
    {
        TargetName = "merged_text"
    });

    MergeSkill mergeSkill = new MergeSkill(inputMappings, outputMappings)
    {
        Description = "Create merged_text which includes all the textual representation of each image inserted at the right location in the content field.",
        Context = "/document",
        InsertPreTag = " ",
        InsertPostTag = " "
    };

    return mergeSkill;
}

Umiejętność wykrywania językaLanguage detection skill

Umiejętność wykrywanie języka wykrywa język tekstu wejściowego i raportuje jeden kod języka dla każdego dokumentu przesłanego w żądaniu.The Language Detection skill detects the language of the input text and reports a single language code for every document submitted on the request. Będziemy używać danych wyjściowych wykrywanie języka w ramach danych wejściowych do kwalifikacji tekstu .We'll use the output of the Language Detection skill as part of the input to the Text Split skill.

private static LanguageDetectionSkill CreateLanguageDetectionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/merged_text"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("languageCode")
    {
        TargetName = "languageCode"
    });

    LanguageDetectionSkill languageDetectionSkill = new LanguageDetectionSkill(inputMappings, outputMappings)
    {
        Description = "Detect the language used in the document",
        Context = "/document"
    };

    return languageDetectionSkill;
}

Umiejętność podziału tekstuText split skill

Poniższa umiejętność podziału podzieli tekst na strony i Ogranicz długość strony do 4 000 znaków, mierzoną przez String.Length .The below Split skill will split text by pages and limit the page length to 4,000 characters as measured by String.Length. Algorytm podejmie próbę podzielenia tekstu na fragmenty o największej maximumPageLength wielkości.The algorithm will try to split the text into chunks that are at most maximumPageLength in size. W takim przypadku algorytm będzie najlepiej przekroczyć zdanie na granicy zdania, dzięki czemu rozmiar fragmentu może być nieco mniejszy niż maximumPageLength .In this case, the algorithm will do its best to break the sentence on a sentence boundary, so the size of the chunk may be slightly less than maximumPageLength.

private static SplitSkill CreateSplitSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/merged_text"
    });
    inputMappings.Add(new InputFieldMappingEntry("languageCode")
    {
        Source = "/document/languageCode"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("textItems")
    {
        TargetName = "pages",
    });

    SplitSkill splitSkill = new SplitSkill(inputMappings, outputMappings)
    {
        Description = "Split content into pages",
        Context = "/document",
        TextSplitMode = TextSplitMode.Pages,
        MaximumPageLength = 4000,
        DefaultLanguageCode = SplitSkillLanguage.En
    };

    return splitSkill;
}

Umiejętność rozpoznawania jednostekEntity recognition skill

To EntityRecognitionSkill wystąpienie jest ustawione na rozpoznawanie typu kategorii organization .This EntityRecognitionSkill instance is set to recognize category type organization. Umiejętność rozpoznawania jednostek może również rozpoznać typy kategorii person i location .The Entity Recognition skill can also recognize category types person and location.

Zwróć uwagę, że pole "context" ma ustawioną "/document/pages/*" gwiazdkę, co oznacza, że krok wzbogacania jest wywoływany dla każdej strony w obszarze "/document/pages" .Notice that the "context" field is set to "/document/pages/*" with an asterisk, meaning the enrichment step is called for each page under "/document/pages".

private static EntityRecognitionSkill CreateEntityRecognitionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/pages/*"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("organizations")
    {
        TargetName = "organizations"
    });

    EntityRecognitionSkill entityRecognitionSkill = new EntityRecognitionSkill(inputMappings, outputMappings)
    {
        Description = "Recognize organizations",
        Context = "/document/pages/*",
        DefaultLanguageCode = EntityRecognitionSkillLanguage.En
    };
    entityRecognitionSkill.Categories.Add(EntityCategory.Organization);

    return entityRecognitionSkill;
}

Umiejętność wyodrębniania kluczowych frazKey phrase extraction skill

Podobnie jak w przypadku EntityRecognitionSkill wystąpienia, które zostało właśnie utworzone, wyodrębnianie kluczowych fraz umiejętności są wywoływane dla każdej strony dokumentu.Like the EntityRecognitionSkill instance that was just created, the Key Phrase Extraction skill is called for each page of the document.

private static KeyPhraseExtractionSkill CreateKeyPhraseExtractionSkill()
{
    List<InputFieldMappingEntry> inputMappings = new List<InputFieldMappingEntry>();
    inputMappings.Add(new InputFieldMappingEntry("text")
    {
        Source = "/document/pages/*"
    });
    inputMappings.Add(new InputFieldMappingEntry("languageCode")
    {
        Source = "/document/languageCode"
    });

    List<OutputFieldMappingEntry> outputMappings = new List<OutputFieldMappingEntry>();
    outputMappings.Add(new OutputFieldMappingEntry("keyPhrases")
    {
        TargetName = "keyPhrases"
    });

    KeyPhraseExtractionSkill keyPhraseExtractionSkill = new KeyPhraseExtractionSkill(inputMappings, outputMappings)
    {
        Description = "Extract the key phrases",
        Context = "/document/pages/*",
        DefaultLanguageCode = KeyPhraseExtractionSkillLanguage.En
    };

    return keyPhraseExtractionSkill;
}

Kompilowanie i tworzenie zestawu umiejętnościBuild and create the skillset

Kompiluj Skillset przy użyciu utworzonych umiejętności.Build the Skillset using the skills you created.

private static SearchIndexerSkillset CreateOrUpdateDemoSkillSet(SearchIndexerClient indexerClient, IList<SearchIndexerSkill> skills,string cognitiveServicesKey)
{
    SearchIndexerSkillset skillset = new SearchIndexerSkillset("demoskillset", skills)
    {
        Description = "Demo skillset",
        CognitiveServicesAccount = new CognitiveServicesAccountKey(cognitiveServicesKey)
    };

    // Create the skillset in your search service.
    // The skillset does not need to be deleted if it was already created
    // since we are using the CreateOrUpdate method
    try
    {
        indexerClient.CreateOrUpdateSkillset(skillset);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the skillset\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without a skillset");
    }

    return skillset;
}

Dodaj następujące wiersze do Main .Add the following lines to Main.

// Create the skills
Console.WriteLine("Creating the skills...");
OcrSkill ocrSkill = CreateOcrSkill();
MergeSkill mergeSkill = CreateMergeSkill();
EntityRecognitionSkill entityRecognitionSkill = CreateEntityRecognitionSkill();
LanguageDetectionSkill languageDetectionSkill = CreateLanguageDetectionSkill();
SplitSkill splitSkill = CreateSplitSkill();
KeyPhraseExtractionSkill keyPhraseExtractionSkill = CreateKeyPhraseExtractionSkill();

// Create the skillset
Console.WriteLine("Creating or updating the skillset...");
List<SearchIndexerSkill> skills = new List<SearchIndexerSkill>();
skills.Add(ocrSkill);
skills.Add(mergeSkill);
skills.Add(languageDetectionSkill);
skills.Add(splitSkill);
skills.Add(entityRecognitionSkill);
skills.Add(keyPhraseExtractionSkill);

SearchIndexerSkillset skillset = CreateOrUpdateDemoSkillSet(indexerClient, skills, cognitiveServicesKey);

Krok 3. Tworzenie indeksuStep 3: Create an index

W tej sekcji zdefiniujesz schemat indeksu przez określenie pól do umieszczenia w indeksie z możliwością wyszukiwania oraz atrybutów wyszukiwania dla każdego pola.In this section, you define the index schema by specifying which fields to include in the searchable index, and the search attributes for each field. Pola mogą mieć typ i atrybuty, które określają sposób używania pola (z możliwością wyszukiwania, sortowania itp.).Fields have a type and can take attributes that determine how the field is used (searchable, sortable, and so forth). Nazwy pól w indeksie nie muszą dokładnie zgadzać się z nazwami pól w źródle.Field names in an index are not required to identically match the field names in the source. W kolejnym kroku są dodawane mapowania pól w indeksatorze w celu połączenia pól źródłowych z polami docelowymi.In a later step, you add field mappings in an indexer to connect source-destination fields. W tym kroku zdefiniuj indeks przy użyciu konwencji nazewnictwa pól właściwej dla aplikacji wyszukiwania.For this step, define the index using field naming conventions pertinent to your search application.

W tym ćwiczeniu są używane następujące pola i typy pól:This exercise uses the following fields and field types:

Nazwy pólField names Typy pólField types
id Edm.StringEdm.String
content Edm.StringEdm.String
languageCode Edm.StringEdm.String
keyPhrases List<Edm.String>List<Edm.String>
organizations List<Edm.String>List<Edm.String>

Utwórz klasę DemoIndexCreate DemoIndex Class

Pola dla tego indeksu są definiowane przy użyciu klasy modelu.The fields for this index are defined using a model class. Każda właściwość klasy modelu ma atrybuty, które określają związane z wyszukiwaniem zachowania odpowiedniego pola indeksu.Each property of the model class has attributes which determine the search-related behaviors of the corresponding index field.

Dodamy klasę modelu do nowego pliku C#.We'll add the model class to a new C# file. Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj > nowy element..., wybierz pozycję "Klasa" i Nazwij plik DemoIndex.cs , a następnie wybierz pozycję Dodaj.Right click on your project and select Add > New Item..., select "Class" and name the file DemoIndex.cs, then select Add.

Upewnij się, że chcesz użyć typów z Azure.Search.Documents.Indexes System.Text.Json.Serialization przestrzeni nazw i.Make sure to indicate that you want to use types from the Azure.Search.Documents.Indexes and System.Text.Json.Serialization namespaces.

Dodaj poniższą definicję klasy modelu do DemoIndex.cs i Uwzględnij ją w tej samej przestrzeni nazw, w której utworzysz indeks.Add the below model class definition to DemoIndex.cs and include it in the same namespace where you'll create the index.

using Azure.Search.Documents.Indexes;
using System.Text.Json.Serialization;

namespace EnrichwithAI
{
    // The SerializePropertyNamesAsCamelCase is currently unsupported as of this writing. 
    // Replace it with JsonPropertyName
    public class DemoIndex
    {
        [SearchableField(IsSortable = true, IsKey = true)]
        [JsonPropertyName("id")]
        public string Id { get; set; }

        [SearchableField]
        [JsonPropertyName("content")]
        public string Content { get; set; }

        [SearchableField]
        [JsonPropertyName("languageCode")]
        public string LanguageCode { get; set; }

        [SearchableField]
        [JsonPropertyName("keyPhrases")]
        public string[] KeyPhrases { get; set; }

        [SearchableField]
        [JsonPropertyName("organizations")]
        public string[] Organizations { get; set; }
    }
}

Teraz, po zdefiniowaniu klasy modelu, Program.cs można łatwo utworzyć definicję indeksu.Now that you've defined a model class, back in Program.cs you can create an index definition fairly easily. Nazwa tego indeksu będzie demoindex .The name for this index will be demoindex. Jeśli istnieje już indeks o tej nazwie, zostanie on usunięty.If an index already exists with that name, it will be deleted.

private static SearchIndex CreateDemoIndex(SearchIndexClient indexClient)
{
    FieldBuilder builder = new FieldBuilder();
    var index = new SearchIndex("demoindex")
    {
        Fields = builder.Build(typeof(DemoIndex))
    };

    try
    {
        indexClient.GetIndex(index.Name);
        indexClient.DeleteIndex(index.Name);
    }
    catch (RequestFailedException ex) when (ex.Status == 404)
    {
        //if the specified index not exist, 404 will be thrown.
    }

    try
    {
        indexClient.CreateIndex(index);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the index\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without an index");
    }

    return index;
}

Podczas testowania może się okazać, że próbujesz utworzyć indeks więcej niż raz.During testing, you may find that you're attempting to create the index more than once. Z tego powodu Sprawdź, czy indeks, który ma zostać utworzony, już istnieje, zanim spróbujesz go utworzyć.Because of this, check to see if the index that you're about to create already exists before attempting to create it.

Dodaj następujące wiersze do Main .Add the following lines to Main.

// Create the index
Console.WriteLine("Creating the index...");
SearchIndex demoIndex = CreateDemoIndex(indexClient);

Dodaj następującą instrukcję using, aby usunąć niejednoznaczne odwołanie.Add the following using statement to resolve the disambiguate reference.

using Index = Azure.Search.Documents.Indexes.Models;

Aby dowiedzieć się więcej o pojęciach dotyczących indeksów, zobacz Tworzenie indeksu (interfejs API REST).To learn more about index concepts, see Create Index (REST API).

Krok 4. Tworzenie i uruchamianie indeksatoraStep 4: Create and run an indexer

Do tej pory utworzono źródło danych, zestaw umiejętności i indeks.So far you have created a data source, a skillset, and an index. Te trzy składniki staną się częścią indeksatora, który łączy wszystkie części w pojedynczą operację obejmującą wiele faz.These three components become part of an indexer that pulls each piece together into a single multi-phased operation. Aby powiązać je razem w indeksatorze, należy zdefiniować mapowania pól.To tie these together in an indexer, you must define field mappings.

  • FieldMappings są przetwarzane przed zestawu umiejętności, mapując pola źródłowe ze źródła danych do pól docelowych w indeksie.The fieldMappings are processed before the skillset, mapping source fields from the data source to target fields in an index. Jeśli nazwy pól i typy są takie same na obu końcach, mapowanie nie jest wymagane.If field names and types are the same at both ends, no mapping is required.

  • OutputFieldMappings są przetwarzane po zestawu umiejętności, do których odwołuje się sourceFieldNames, które nie istnieją do momentu utworzenia przez nich pęknięć lub wzbogacania dokumentów.The outputFieldMappings are processed after the skillset, referencing sourceFieldNames that don't exist until document cracking or enrichment creates them. TargetFieldName to pole w indeksie.The targetFieldName is a field in an index.

Oprócz podłączania danych wejściowych do danych wyjściowych, można również używać mapowań pól do spłaszczania struktur.In addition to hooking up inputs to outputs, you can also use field mappings to flatten data structures. Aby uzyskać więcej informacji, zobacz Jak mapować wzbogacone pola na indeks wyszukiwania.For more information, see How to map enriched fields to a searchable index.

private static SearchIndexer CreateDemoIndexer(SearchIndexerClient indexerClient, SearchIndexerDataSourceConnection dataSource, SearchIndexerSkillset skillSet, SearchIndex index)
{
    IndexingParameters indexingParameters = new IndexingParameters()
    {
        MaxFailedItems = -1,
        MaxFailedItemsPerBatch = -1,
    };
    indexingParameters.Configuration.Add("dataToExtract", "contentAndMetadata");
    indexingParameters.Configuration.Add("imageAction", "generateNormalizedImages");

    SearchIndexer indexer = new SearchIndexer("demoindexer", dataSource.Name, index.Name)
    {
        Description = "Demo Indexer",
        SkillsetName = skillSet.Name,
        Parameters = indexingParameters
    };

    FieldMappingFunction mappingFunction = new FieldMappingFunction("base64Encode");
    mappingFunction.Parameters.Add("useHttpServerUtilityUrlTokenEncode", true);

    indexer.FieldMappings.Add(new FieldMapping("metadata_storage_path")
    {
        TargetFieldName = "id",
        MappingFunction = mappingFunction

    });
    indexer.FieldMappings.Add(new FieldMapping("content")
    {
        TargetFieldName = "content"
    });

    indexer.OutputFieldMappings.Add(new FieldMapping("/document/pages/*/organizations/*")
    {
        TargetFieldName = "organizations"
    });
    indexer.OutputFieldMappings.Add(new FieldMapping("/document/pages/*/keyPhrases/*")
    {
        TargetFieldName = "keyPhrases"
    });
    indexer.OutputFieldMappings.Add(new FieldMapping("/document/languageCode")
    {
        TargetFieldName = "languageCode"
    });

    try
    {
        indexerClient.GetIndexer(indexer.Name);
        indexerClient.DeleteIndexer(indexer.Name);
    }
    catch (RequestFailedException ex) when (ex.Status == 404)
    {
        //if the specified indexer not exist, 404 will be thrown.
    }

    try
    {
        indexerClient.CreateIndexer(indexer);
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to create the indexer\n Exception message: {0}\n", ex.Message);
        ExitProgram("Cannot continue without creating an indexer");
    }

    return indexer;
}

Dodaj następujące wiersze do Main .Add the following lines to Main.

// Create the indexer, map fields, and execute transformations
Console.WriteLine("Creating the indexer and executing the pipeline...");
SearchIndexer demoIndexer = CreateDemoIndexer(indexerClient, dataSource, skillset, demoIndex);

Oczekiwanie na ukończenie przetwarzania indeksatora.Expect indexer processing to take some time to complete. Mimo że zestaw danych jest mały, umiejętności analityczne wykorzystują znaczną moc obliczeniową.Even though the data set is small, analytical skills are computation-intensive. Wykonywanie niektórych umiejętności, takich jak analiza obrazu, jest długotrwałe.Some skills, such as image analysis, are long-running.

Porada

Utworzenie indeksatora powoduje wywołanie potoku.Creating an indexer invokes the pipeline. Jeśli występują problemy z dostępem do danych, mapowaniem danych wejściowych i wyjściowych lub kolejnością operacji, pojawią się one na tym etapie.If there are problems reaching the data, mapping inputs and outputs, or order of operations, they appear at this stage.

Eksplorowanie tworzenia indeksatoraExplore creating the indexer

Kod jest ustawiony "maxFailedItems" na wartość-1, co powoduje ignorowanie błędów podczas importowania danych przez aparat indeksowania.The code sets "maxFailedItems" to -1, which instructs the indexing engine to ignore errors during data import. Jest to przydatne, ponieważ pokazowe źródło danych zawiera tak mało dokumentów.This is useful because there are so few documents in the demo data source. W przypadku większego źródła danych należy ustawić wartość większą od 0.For a larger data source, you would set the value to greater than 0.

Zauważ również, że "dataToExtract" jest ustawiony na "contentAndMetadata" .Also notice the "dataToExtract" is set to "contentAndMetadata". Ta instrukcja nakazuje indeksatorowi automatyczne wyodrębnianie zawartości z plików w różnych formatach, a także metadanych związanych z każdym plikiem.This statement tells the indexer to automatically extract the content from different file formats as well as metadata related to each file.

Gdy zawartość zostanie wyodrębniona, możesz ustawić element imageAction, aby wyodrębnić tekst z obrazów znalezionych w źródle danych.When content is extracted, you can set imageAction to extract text from images found in the data source. "imageAction"Zestaw do "generateNormalizedImages" konfiguracji, w połączeniu z umiejętnością OCR i umiejętnością scalania tekstu, informuje indeksator, aby wyodrębnił tekst z obrazów (na przykład słowo "Stop" od znaku zatrzymania ruchu) i osadzić je jako część pola zawartość.The "imageAction" set to "generateNormalizedImages" configuration, combined with the OCR Skill and Text Merge Skill, tells the indexer to extract text from the images (for example, the word "stop" from a traffic Stop sign), and embed it as part of the content field. To zachowanie dotyczy zarówno obrazów osadzonych w dokumentach (np. w pliku PDF), jak i znalezionych w źródle danych (np. pliku JPG).This behavior applies to both the images embedded in the documents (think of an image inside a PDF), as well as images found in the data source, for instance a JPG file.

4 — monitorowanie indeksowania4 - Monitor indexing

Po zdefiniowaniu indeksatora jest on uruchamiany automatycznie przy przesyłaniu żądania.Once the indexer is defined, it runs automatically when you submit the request. W zależności od tego, które umiejętności poznawcze zdefiniowano, indeksowanie może trwać dłużej, niż oczekujesz.Depending on which cognitive skills you defined, indexing can take longer than you expect. Aby dowiedzieć się, czy indeksator jest nadal uruchomiony, użyj GetStatus metody.To find out whether the indexer is still running, use the GetStatus method.

private static void CheckIndexerOverallStatus(SearchIndexerClient indexerClient, SearchIndexer indexer)
{
    try
    {
        var demoIndexerExecutionInfo = indexerClient.GetIndexerStatus(indexer.Name);

        switch (demoIndexerExecutionInfo.Value.Status)
        {
            case IndexerStatus.Error:
                ExitProgram("Indexer has error status. Check the Azure Portal to further understand the error.");
                break;
            case IndexerStatus.Running:
                Console.WriteLine("Indexer is running");
                break;
            case IndexerStatus.Unknown:
                Console.WriteLine("Indexer status is unknown");
                break;
            default:
                Console.WriteLine("No indexer information");
                break;
        }
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine("Failed to get indexer overall status\n Exception message: {0}\n", ex.Message);
    }
}

demoIndexerExecutionInfo reprezentuje bieżący stan i historię wykonywania indeksatora.demoIndexerExecutionInfo represents the current status and execution history of an indexer.

Ostrzeżenia często występują dla niektórych kombinacji plików źródłowych i umiejętności oraz nie zawsze wskazują istnienie problemu.Warnings are common with some source file and skill combinations and do not always indicate a problem. W tym samouczku ostrzeżenia są niegroźne (np. brak tekstowych danych wejściowych dla plików JPEG).In this tutorial, the warnings are benign (for example, no text inputs from the JPEG files).

Dodaj następujące wiersze do Main .Add the following lines to Main.

// Check indexer overall status
Console.WriteLine("Check the indexer overall status...");
CheckIndexerOverallStatus(indexerClient, demoIndexer);

W samouczku platformy Azure Wyszukiwanie poznawcze aplikacje konsolowe zwykle dodają 2-sekundowe opóźnienie przed uruchomieniem zapytań, które zwracają wyniki, ale ponieważ wzbogacanie trwa kilka minut, zamknie aplikację konsolową i użyjemy zamiast tego innego podejścia.In Azure Cognitive Search tutorial console apps, we typically add a 2-second delay before running queries that return results, but because enrichment takes several minutes to complete, we'll close the console app and use another approach instead.

Najprostszym rozwiązaniem jest Eksplorator wyszukiwania w portalu.The easiest option is Search explorer in the portal. Można najpierw uruchomić puste zapytanie zwracające wszystkie dokumenty lub bardziej przeszukiwane wyszukiwanie zwracające nową zawartość pola utworzoną przez potok.You can first run an empty query that returns all documents, or a more targeted search that returns new field content created by the pipeline.

  1. W Azure Portal na stronie Przegląd wyszukiwania wybierz pozycję indeksy.In Azure portal, in the search Overview page, select Indexes.

  2. Znajdź demoindex na liście.Find demoindex in the list. Powinien on mieć 14 dokumentów.It should have 14 documents. Jeśli liczba dokumentów wynosi zero, indeksator jest nadal uruchomiony lub strona nie została jeszcze odświeżona.If the document count is zero, the indexer is either still running or the page hasn't been refreshed yet.

  3. Wybierz pozycję demoindex.Select demoindex. Eksplorator wyszukiwania jest pierwszą kartą.Search explorer is the first tab.

  4. Zawartość jest przeszukiwana zaraz po załadowaniu pierwszego dokumentu.Content is searchable as soon as the first document is loaded. Aby sprawdzić, czy zawartość istnieje, uruchom nieokreślone zapytanie, klikając pozycję Wyszukaj.To verify content exists, run an unspecified query by clicking Search. To zapytanie zwraca wszystkie aktualnie indeksowane dokumenty, co daje pomysł dotyczący tego, co zawiera indeks.This query returns all currently indexed documents, giving you an idea of what the index contains.

  5. Następnie wklej następujący ciąg, aby uzyskać więcej możliwości zarządzania: search=*&$select=id, languageCode, organizationsNext, paste in the following string for more manageable results: search=*&$select=id, languageCode, organizations

Resetowanie i ponowne uruchamianieReset and rerun

W przypadku wczesnych eksperymentalnych etapów tworzenia najlepszym podejściem do iteracji projektu jest usunięcie obiektów z platformy Azure Wyszukiwanie poznawcze i umożliwienie kodowi odbudowania.In the early experimental stages of development, the most practical approach for design iteration is to delete the objects from Azure Cognitive Search and allow your code to rebuild them. Nazwy zasobów są unikatowe.Resource names are unique. Usunięcie obiektu umożliwia jego ponowne utworzenie przy użyciu tej samej nazwy.Deleting an object lets you recreate it using the same name.

Przykładowy kod dla tego samouczka sprawdza istniejące obiekty i usuwa je, aby można było ponownie uruchomić kod.The sample code for this tutorial checks for existing objects and deletes them so that you can rerun your code. Możesz również użyć portalu, aby usunąć indeksy, indeksatory, źródła danych i umiejętności.You can also use the portal to delete indexes, indexers, data sources, and skillsets.

WnioskiTakeaways

W tym samouczku przedstawiono podstawowe kroki tworzenia przebudowanego potoku indeksowania przez tworzenie części składników: źródła danych, zestawu umiejętności, indeksu i indeksatora.This tutorial demonstrated the basic steps for building an enriched indexing pipeline through the creation of component parts: a data source, skillset, index, and indexer.

Wprowadzono wbudowane umiejętności , wraz z definicją zestawu umiejętności oraz Mechanics umiejętności związanych z łańcuchem, a także za pomocą danych wejściowych i wyjściowych.Built-in skills were introduced, along with skillset definition and the mechanics of chaining skills together through inputs and outputs. Poznasz również, że outputFieldMappings w definicji indeksatora jest wymagany do routingu wzbogaconych wartości z potoku do indeksu wyszukiwania w usłudze Azure wyszukiwanie poznawcze.You also learned that outputFieldMappings in the indexer definition is required for routing enriched values from the pipeline into a searchable index on an Azure Cognitive Search service.

Ponadto przedstawiono sposób testowania wyników i resetowania systemu na potrzeby przyszłych iteracji.Finally, you learned how to test results and reset the system for further iterations. Omówiono proces, w ramach którego odpytanie indeksu powoduje zwrócenie danych wyjściowych utworzonych przez wzbogacony potok indeksowania.You learned that issuing queries against the index returns the output created by the enriched indexing pipeline. Zaprezentowano procedurę sprawdzania stanu indeksatora i usuwania obiektów przed ponownym uruchomieniem potoku.You also learned how to check indexer status, and which objects to delete before rerunning a pipeline.

Czyszczenie zasobówClean up resources

Gdy Pracujesz w ramach własnej subskrypcji, na końcu projektu warto usunąć zasoby, które nie są już potrzebne.When you're working in your own subscription, at the end of a project, it's a good idea to remove the resources that you no longer need. Uruchomione zasoby mogą generować koszty.Resources left running can cost you money. Zasoby możesz usuwać pojedynczo lub możesz usunąć grupę zasobów, aby usunąć cały ich zestaw.You can delete resources individually or delete the resource group to delete the entire set of resources.

Zasoby można znaleźć w portalu i zarządzać nimi za pomocą linku wszystkie zasoby lub grupy zasobów w okienku nawigacji po lewej stronie.You can find and manage resources in the portal, using the All resources or Resource groups link in the left-navigation pane.

Następne krokiNext steps

Teraz, gdy znasz wszystkie obiekty w potoku wzbogacenia, przyjrzyjmy się dokładniej definicjom zestawu umiejętności i indywidualnym umiejętnościom.Now that you're familiar with all of the objects in an AI enrichment pipeline, let's take a closer look at skillset definitions and individual skills.