Indeksowanie obiektów blob i plików JSON w usłudze Azure AI Search

Dotyczy: indeksatory obiektów blob, indeksatory plików

W przypadku indeksowania obiektów blob w usłudze Azure AI Search w tym artykule pokazano, jak ustawić właściwości obiektów blob lub plików składających się z dokumentów JSON. Pliki JSON w usłudze Azure Blob Storage lub Azure Files często zakładają dowolną z tych form:

  • Pojedynczy dokument JSON
  • Dokument JSON zawierający tablicę dobrze sformułowanych elementów JSON
  • Dokument JSON zawierający wiele jednostek oddzielony nową linią

Indeksator obiektów blob udostępnia parsingMode parametr umożliwiający optymalizację danych wyjściowych dokumentu wyszukiwania na podstawie struktury JSON. Tryby analizowania składają się z następujących opcji:

parsingMode Dokument JSON opis
json Jeden na obiekt blob (ustawienie domyślne) Analizuje obiekty blob JSON jako pojedynczy fragment tekstu. Każdy obiekt blob JSON staje się pojedynczym dokumentem wyszukiwania.
jsonArray Wiele na obiekt blob Analizuje tablicę JSON w obiekcie blob, gdzie każdy element tablicy staje się oddzielnym dokumentem wyszukiwania.
jsonLines Wiele na obiekt blob Analizuje obiekt blob, który zawiera wiele jednostek JSON (również tablicy), z poszczególnymi elementami oddzielonymi przez nowy wiersz. Indeksator uruchamia nowy dokument wyszukiwania po każdym nowym wierszu.

W przypadku obu jsonArray obiektów i jsonLinesprzejrzyj artykuł Indeksowanie jednego obiektu blob, aby utworzyć wiele dokumentów wyszukiwania, aby zrozumieć, jak indeksator obiektów blob obsługuje uściślanie klucza dokumentu dla wielu dokumentów wyszukiwania utworzonych z tego samego obiektu blob.

W definicji indeksatora można opcjonalnie ustawić mapowania pól, aby wybrać właściwości źródłowego dokumentu JSON do wypełnienia docelowego indeksu wyszukiwania. Na przykład w przypadku korzystania z jsonArray trybu analizowania, jeśli tablica istnieje jako właściwość niższego poziomu, można ustawić właściwość "documentRoot" wskazującą, gdzie tablica znajduje się w obiekcie blob.

Uwaga

Gdy jest używany tryb analizowania w formacie JSON, usługa Azure AI Search zakłada, że wszystkie obiekty blob używają tego samego analizatora (dla jsonjsonArray , lub jsonLines). Jeśli masz kombinację różnych typów plików w tym samym źródle danych, rozważ użycie filtrów rozszerzeń plików w celu kontrolowania, które pliki są importowane.

W poniższych sekcjach opisano poszczególne tryby bardziej szczegółowo. Jeśli nie znasz klientów i pojęć indeksatora, zobacz Tworzenie indeksatora wyszukiwania. Należy również zapoznać się ze szczegółami podstawowej konfiguracji indeksatora obiektów blob, która nie jest powtarzana w tym miejscu.

Indeksowanie pojedynczych dokumentów JSON (jeden na obiekt blob)

Domyślnie indeksatory obiektów blob analizują obiekty blob JSON jako pojedynczy fragment tekstu, jeden dokument wyszukiwania dla każdego obiektu blob w kontenerze. Jeśli kod JSON jest ustrukturyzowany, dokument wyszukiwania może odzwierciedlać strukturę z poszczególnymi elementami reprezentowanymi jako poszczególne pola. Załóżmy na przykład, że masz następujący dokument JSON w usłudze Azure Blob Storage:

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2020-04-13",
        "tags" : [ "search", "storage", "howto" ]    
    }
}

Indeksator obiektów blob analizuje dokument JSON w jednym dokumencie wyszukiwania, ładując indeks, pasując do "text", "datePublished" i "tags" ze źródła względem pól indeksu docelowego o identycznych nazwach i typach. Biorąc pod uwagę indeks z polami "text", "datePublished i "tags", indeksator obiektów blob może wywnioskować poprawne mapowanie bez mapowania pól w żądaniu.

Mimo że domyślne zachowanie to jeden dokument wyszukiwania na obiekt blob JSON, ustawienie json trybu analizowania zmienia wewnętrzne mapowania pól dla zawartości, promując pola wewnątrz content do rzeczywistych pól w indeksie wyszukiwania. Przykładowa definicja indeksatora json dla trybu analizowania może wyglądać następująco:

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "json" } }
}

Uwaga

Podobnie jak w przypadku wszystkich indeksatorów, jeśli pola nie są wyraźnie zgodne, należy oczekiwać jawnego określenia poszczególnych mapowań pól, chyba że używasz niejawnych mapowań pól dostępnych dla zawartości i metadanych obiektów blob, zgodnie z opisem w podstawowej konfiguracji indeksatora obiektów blob.

Przykład json (pliki JSON z pojedynczym hotelem)

Zestaw danych dokumentów JSON w hotelu w usłudze GitHub jest przydatny do testowania analizy JSON, gdzie każdy obiekt blob reprezentuje ustrukturyzowany plik JSON. Możesz przekazać pliki danych do usługi Blob Storage i użyć Kreatora importu danych, aby szybko ocenić, jak ta zawartość jest analizowana do poszczególnych dokumentów wyszukiwania.

Zestaw danych składa się z pięciu obiektów blob, z których każdy zawiera dokument hotelowy z kolekcją adresów i kolekcją pomieszczeń. Indeksator obiektów blob wykrywa zarówno kolekcje, jak i odzwierciedla strukturę dokumentów wejściowych w schemacie indeksu.

Analizowanie tablic JSON

Alternatywnie możesz użyć opcji tablicy JSON. Ta opcja jest przydatna, gdy obiekty blob zawierają tablicę dobrze sformułowanych obiektów JSON i chcesz, aby każdy element stał się oddzielnym dokumentem wyszukiwania. Przy użyciu metody jsonArraysponiższy obiekt blob JSON tworzy trzy oddzielne dokumenty, z których każdy ma "id" pola i "text" .

[
    { "id" : "1", "text" : "example 1" },
    { "id" : "2", "text" : "example 2" },
    { "id" : "3", "text" : "example 3" }
]

Właściwość parameters indeksatora zawiera wartości trybu analizowania. W przypadku tablicy JSON definicja indeksatora powinna wyglądać podobnie do poniższego przykładu.

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "jsonArray" } }
}

Przykład jsonArrays

Zestaw danych JSON New York Philharmonic w witrynie GitHub jest przydatny do testowania analizowania tablic JSON. Możesz przekazać pliki danych do usługi Blob Storage i użyć Kreatora importu danych, aby szybko ocenić, jak ta zawartość jest analizowana do poszczególnych dokumentów wyszukiwania.

Zestaw danych składa się z ośmiu obiektów blob, z których każda zawiera tablicę JSON jednostek dla łącznie 100 jednostek. Jednostki różnią się w zależności od tego, które pola są wypełniane, ale wynik końcowy jest jednym dokumentem wyszukiwania na jednostkę, ze wszystkich tablic we wszystkich obiektach blob.

Analizowanie zagnieżdżonych tablic JSON

W przypadku tablic JSON zawierających zagnieżdżone elementy można określić element documentRoot , aby wskazać strukturę wielo poziomową. Jeśli na przykład obiekty blob wyglądają następująco:

{
    "level1" : {
        "level2" : [
            { "id" : "1", "text" : "Use the documentRoot property" },
            { "id" : "2", "text" : "to pluck the array you want to index" },
            { "id" : "3", "text" : "even if it's nested inside the document" }  
        ]
    }
}

Ta konfiguracja służy do indeksowania tablicy zawartej level2 we właściwości :

{
    "name" : "my-json-array-indexer",
    ... other indexer properties
    "parameters" : { "configuration" : { "parsingMode" : "jsonArray", "documentRoot" : "/level1/level2" } }
}

Analizowanie jednostek JSON oddzielonych nowymi liniami

Jeśli obiekt blob zawiera wiele jednostek JSON oddzielonych nową linią i chcesz, aby każdy element stał się oddzielnym dokumentem wyszukiwania, użyj polecenia jsonLines.

{ "id" : "1", "text" : "example 1" }
{ "id" : "2", "text" : "example 2" }
{ "id" : "3", "text" : "example 3" }

W przypadku wierszy JSON definicja indeksatora powinna wyglądać podobnie do poniższego przykładu.

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "jsonLines" } }
}

Mapowanie pól JSON na pola wyszukiwania

Mapowania pól kojarzą pole źródłowe z polem docelowym w sytuacjach, w których nazwy pól i typy nie są identyczne. Jednak mapowania pól mogą być również używane do dopasowywania części dokumentu JSON i "lift" do pól najwyższego poziomu dokumentu wyszukiwania.

Poniższy przykład ilustruje ten scenariusz. Aby uzyskać więcej informacji na temat mapowań pól w ogóle, zobacz Mapowania pól.

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2016-04-13"
        "tags" : [ "search", "storage", "howto" ]    
    }
}

Przyjmij indeks wyszukiwania z następującymi polami: text typu Edm.String, date typu i tags typu Edm.DateTimeOffsetCollection(Edm.String). Zwróć uwagę na rozbieżność między wartością "datePublished" w źródle i date polu w indeksie. Aby zamapować kod JSON na żądany kształt, użyj następujących mapowań pól:

"fieldMappings" : [
    { "sourceFieldName" : "/article/text", "targetFieldName" : "text" },
    { "sourceFieldName" : "/article/datePublished", "targetFieldName" : "date" },
    { "sourceFieldName" : "/article/tags", "targetFieldName" : "tags" }
    ]

Pola źródłowe są określane przy użyciu notacji wskaźnika JSON. Zacznij od ukośnika, aby odwołać się do katalogu głównego dokumentu JSON, a następnie wybrać żądaną właściwość (na dowolnym poziomie zagnieżdżania) przy użyciu ścieżki rozdzielanej ukośnikiem.

Można również odwoływać się do poszczególnych elementów tablicy przy użyciu indeksu opartego na zerach. Aby na przykład wybrać pierwszy element tablicy "tags" z powyższego przykładu, użyj mapowania pól w następujący sposób:

{ "sourceFieldName" : "/article/tags/0", "targetFieldName" : "firstTag" }

Uwaga

Jeśli element "sourceFieldName" odwołuje się do właściwości, która nie istnieje w obiekcie blob JSON, to mapowanie jest pomijane bez błędu. To zachowanie umożliwia indeksowanie w przypadku obiektów blob JSON, które mają inny schemat (jest to typowy przypadek użycia). Ponieważ nie ma sprawdzania poprawności, dokładnie sprawdź mapowania literówek, aby nie tracić dokumentów z niewłaściwej przyczyny.

Następne kroki