Analizatory do przetwarzania tekstu w usłudze Azure AI Search

Analizator jest składnikiem wyszukiwarki pełnotekstowej odpowiedzialnej za przetwarzanie ciągów podczas indeksowania i wykonywania zapytań. Przetwarzanie tekstu (nazywane również analizą leksykacyjną) jest transformacyjne, modyfikując ciąg za pomocą akcji, takich jak:

  • Usuwanie nieistotnych słów (stopwords) i interpunkcji
  • Dzielenie fraz i wyrazów podzielonych na części składowe
  • Małe litery dowolnych wyrazów z wielkimi literami
  • Zmniejsz liczbę wyrazów do pierwotnych formularzy głównych w celu zwiększenia wydajności magazynowania, aby można było znaleźć dopasowania niezależnie od napiętych

Analiza dotyczy Edm.String pól oznaczonych jako "z możliwością wyszukiwania", co oznacza wyszukiwanie pełnotekstowe.

W przypadku pól tej konfiguracji analiza odbywa się podczas indeksowania podczas tworzenia tokenów, a następnie ponownie podczas wykonywania zapytania, gdy zapytania są analizowane, a aparat skanuje pod kątem pasujących tokenów. Dopasowanie jest bardziej prawdopodobne, gdy ten sam analizator jest używany zarówno do indeksowania, jak i zapytań, ale można ustawić analizator dla każdego obciążenia niezależnie, w zależności od wymagań.

Typy zapytań, które niewyszukiwaniem pełnotekstowym, takie jak filtry lub wyszukiwanie rozmyte, nie przechodzą przez fazę analizy po stronie zapytania. Zamiast tego analizator wysyła te ciągi bezpośrednio do wyszukiwarki przy użyciu wzorca podanego jako podstawa dopasowania. Zazwyczaj te formularze zapytań wymagają tokenów całych ciągów, aby dopasować wzorzec do pracy. Aby zapewnić zachowanie całych tokenów terminów podczas indeksowania, może być konieczne użycie analizatorów niestandardowych. Aby uzyskać więcej informacji o tym, kiedy i dlaczego terminy zapytań są analizowane, zobacz Wyszukiwanie pełnotekstowe w usłudze Azure AI Search.

Aby uzyskać więcej informacji na temat analizy leksykalnej, posłuchaj poniższego klipu wideo, aby uzyskać krótkie wyjaśnienie.

Analizator domyślny

W usłudze Azure AI Search analizator jest automatycznie wywoływany we wszystkich polach ciągów oznaczonych jako możliwe do wyszukiwania.

Domyślnie usługa Azure AI Search używa analizatora Apache Lucene Standard (standard lucene), który dzieli tekst na elementy zgodnie z regułami "Segmentacja tekstu Unicode". Analizator standardowy konwertuje wszystkie znaki na ich małe litery. Zarówno indeksowane dokumenty, jak i terminy wyszukiwania przechodzą przez analizę podczas indeksowania i przetwarzania zapytań.

Wartość domyślną można zastąpić dla pola według pola. Analizatory alternatywne mogą być analizatorem języka do przetwarzania językowego, analizatora niestandardowego lub wbudowanego analizatora z listy dostępnych analizatorów.

Typy analizatorów

Poniższa lista zawiera opis analizatorów dostępnych w usłudze Azure AI Search.

Kategoria opis
Standardowy analizator Lucene Domyślne. Nie jest wymagana żadna specyfikacja ani konfiguracja. Ten analizator ogólnego przeznaczenia działa dobrze w wielu językach i scenariuszach.
Wbudowane analizatory Używane jako i przywołyne według nazwy. Istnieją dwa typy: język i niezależny od języka.

Wyspecjalizowane (niezależne od języka) analizatory są używane, gdy wprowadzanie tekstu wymaga wyspecjalizowanego przetwarzania lub minimalnego przetwarzania. Przykłady analizatorów w tej kategorii obejmują Asciifolding, Słowo kluczowe, Wzorzec, Simple, Stop, Whitespace.

Analizatory języków są używane, gdy potrzebujesz rozbudowanej obsługi językowej dla poszczególnych języków. Usługa Azure AI Search obsługuje 35 analizatorów języka Lucene i 50 analizatorów przetwarzania języka naturalnego firmy Microsoft.
Analizatory niestandardowe Odnosi się do konfiguracji zdefiniowanej przez użytkownika kombinacji istniejących elementów składających się z jednego tokenizatora (wymagane) i opcjonalnych filtrów (char lub token).

Kilka wbudowanych analizatorów, takich jak Wzorzec lub Zatrzymanie, obsługuje ograniczony zestaw opcji konfiguracji. Aby ustawić te opcje, utwórz analizator niestandardowy składający się z wbudowanego analizatora i jednej z alternatywnych opcji opisanych w wbudowanych analizatorach. Podobnie jak w przypadku dowolnej konfiguracji niestandardowej, podaj nową konfigurację o nazwie, takiej jak myPatternAnalyzer , aby odróżnić ją od analizatora wzorca Lucene.

Określanie analizatorów

Ustawienie analizatora jest opcjonalne. Ogólnie rzecz biorąc, spróbuj najpierw użyć domyślnego standardowego analizatora Lucene, aby zobaczyć, jak działa. Jeśli zapytania nie zwracają oczekiwanych wyników, przełączenie do innego analizatora jest często właściwym rozwiązaniem.

  1. Jeśli używasz analizatora niestandardowego, dodaj go do indeksu wyszukiwania w sekcji "analyzer". Aby uzyskać więcej informacji, zobacz Tworzenie indeksu , a także Dodawanie analizatorów niestandardowych.

  2. Podczas definiowania pola ustaw właściwość "analyzer" na jedną z następujących wartości: wbudowany analizator, taki jak słowo kluczowe, analizator języka, taki jak en.microsoft, lub analizator niestandardowy (zdefiniowany w tym samym schemacie indeksu).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Jeśli używasz analizatora języka, musisz użyć właściwości "analyzer", aby ją określić. Właściwości "searchAnalyzer" i "indexAnalyzer" nie mają zastosowania do analizatorów języków.

  4. Alternatywnie ustaw wartość "indexAnalyzer" i "searchAnalyzer", aby zmieniać analizator dla każdego obciążenia. Te właściwości współpracują ze sobą jako zamiennik właściwości "analyzer", która musi mieć wartość null. Możesz użyć różnych analizatorów do indeksowania i zapytań, jeśli jedno z tych działań wymaga określonego przekształcenia, które nie jest wymagane przez drugą.

      "fields": [
     {
       "name": "ProductGroup",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "indexAnalyzer": "keyword",
       "searchAnalyzer": "standard"
     },
    

Kiedy dodać analizatory

Najlepszy czas dodawania i przypisywania analizatorów jest podczas aktywnego opracowywania, gdy upuszczanie i ponowne tworzenie indeksów jest rutynowe.

Ponieważ analizatory są używane do tokenizowania terminów, należy przypisać analizator po utworzeniu pola. W rzeczywistości przypisanie analizatora lub indeksuAnalyzer do pola, które zostało już utworzone fizycznie, nie jest dozwolone (chociaż można zmienić właściwość searchAnalyzer w dowolnym momencie bez wpływu na indeks).

Aby zmienić analizator istniejącego pola, należy usunąć i ponownie utworzyć cały indeks (nie można ponownie skompilować poszczególnych pól). W przypadku indeksów w środowisku produkcyjnym można odroczyć ponowne kompilowanie, tworząc nowe pole przy użyciu nowego przypisania analizatora i zaczynając używać go zamiast starego. Użyj indeksu aktualizacji, aby dołączyć nowe pole i scalanieOrUpload , aby je wypełnić. Później w ramach planowanej obsługi indeksu można wyczyścić indeks, aby usunąć przestarzałe pola.

Aby dodać nowe pole do istniejącego indeksu, wywołaj metodę Update Index , aby dodać pole, i mergeOrUpload , aby je wypełnić.

Aby dodać analizator niestandardowy do istniejącego indeksu, przekaż flagę "allowIndexDowntime" w indeksie aktualizacji, jeśli chcesz uniknąć tego błędu:

"Index update not allowed because it would cause downtime. In order to add new analyzers, tokenizers, token filters, or character filters to an existing index, set the 'allowIndexDowntime' query parameter to 'true' in the index update request. Note that this operation will put your index offline for at least a few seconds, causing your indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes."

Rekomendacje do pracy z analizatorami

Ta sekcja zawiera porady dotyczące pracy z analizatorami.

Jeden analizator do odczytu i zapisu, chyba że masz określone wymagania

Usługa Azure AI Search umożliwia określanie różnych analizatorów indeksowania i wyszukiwania za pomocą właściwości pól "indexAnalyzer" i "searchAnalyzer". Jeśli nie określono, analizator ustawiony z właściwością analizatora jest używany zarówno do indeksowania, jak i wyszukiwania. Jeśli analizator jest nieokreślony, używany jest domyślny analizator Lucene w warstwie Standardowa.

Ogólną regułą jest użycie tego samego analizatora zarówno do indeksowania, jak i wykonywania zapytań, chyba że określone wymagania określają inaczej. Pamiętaj, aby dokładnie przetestować. Gdy przetwarzanie tekstu różni się w czasie wyszukiwania i indeksowania, występuje ryzyko niezgodności między terminami zapytania i terminami indeksowania, gdy konfiguracje analizatora wyszukiwania i indeksowania nie są wyrównane.

Testowanie podczas aktywnego programowania

Zastępowanie analizatora standardowego wymaga ponownego kompilowania indeksu. Jeśli to możliwe, zdecyduj, które analizatory mają być używane podczas aktywnego programowania, przed przejściem indeksu do środowiska produkcyjnego.

Sprawdzanie tokenizowanych terminów

Jeśli wyszukiwanie nie zwróci oczekiwanych wyników, najbardziej prawdopodobnym scenariuszem jest rozbieżność tokenów między danymi wejściowymi terminów w zapytaniu i terminami tokenizowanymi w indeksie. Jeśli tokeny nie są takie same, dopasowanie nie zmaterializuje się. Aby sprawdzić dane wyjściowe tokenizatora, zalecamy użycie interfejsu API analizowania jako narzędzia do badania. Odpowiedź składa się z tokenów generowanych przez określony analizator.

Przykłady rest

W poniższych przykładach przedstawiono definicje analizatora dla kilku kluczowych scenariuszy.

Przykład analizatora niestandardowego

W tym przykładzie przedstawiono definicję analizatora z opcjami niestandardowymi. Opcje niestandardowe filtrów znaków, tokenizatorów i filtrów tokenów są określane oddzielnie jako konstrukcje nazwane, a następnie przywoływane w definicji analizatora. Wstępnie zdefiniowane elementy są używane jako i przywoływane według nazwy.

Przewodnik po tym przykładzie:

  • Analizatory są właściwością klasy pól dla pola z możliwością wyszukiwania.

  • Analizator niestandardowy jest częścią definicji indeksu. Może być lekko dostosowany (na przykład dostosowanie pojedynczej opcji w jednym filtrze) lub dostosowane w wielu miejscach.

  • W tym przypadku analizator niestandardowy to "my_analyzer", który z kolei używa niestandardowego tokenizatora standardowego "my_standard_tokenizer" i dwóch filtrów tokenów: małe litery i dostosowany filtr asciifolding "my_asciifolding".

  • Definiuje również 2 niestandardowe filtry znaków "map_dash" i "remove_whitespace". Pierwsza z nich zastępuje wszystkie kreski podkreśleniami, a druga usuwa wszystkie spacje. Spacje muszą być zakodowane w formacie UTF-8 w regułach mapowania. Filtry znaków są stosowane przed tokenizacją i będą mieć wpływ na wynikowe tokeny (standardowy tokenizer przerywa i spacje, ale nie na podkreśleniu).

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"my_analyzer"
        }
     ],
     "analyzers":[
        {
           "name":"my_analyzer",
           "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenizer":"my_standard_tokenizer",
           "tokenFilters":[
              "my_asciifolding",
              "lowercase"
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenizers":[
        {
           "name":"my_standard_tokenizer",
           "@odata.type":"#Microsoft.Azure.Search.StandardTokenizerV2",
           "maxTokenLength":20
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Przykład przypisania analizatora poszczególnych pól

Analizator standardowy jest domyślny. Załóżmy, że chcesz zastąpić wartość domyślną innym wstępnie zdefiniowanym analizatorem, takim jak analizator wzorców. Jeśli nie ustawiasz opcji niestandardowych, musisz określić ją tylko według nazwy w definicji pola.

Element "analyzer" zastępuje analizator w warstwie Standardowa na podstawie pola według pola. Nie ma przesłonięcia globalnego. W tym przykładzie text1 użyto analizatora wzorców i text2, który nie określa analizatora, używa wartości domyślnej.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text1",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"pattern"
        },
        {
           "name":"text2",
           "type":"Edm.String",
           "searchable":true
        }
     ]
  }

Analizatory mieszania na potrzeby operacji indeksowania i wyszukiwania

Interfejsy API zawierają atrybuty indeksu służące do określania różnych analizatorów do indeksowania i wyszukiwania. Atrybuty searchAnalyzer i indexAnalyzer muszą być określone jako para, zastępując atrybut pojedynczego analizatora.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
     ],
  }

Przykład analizatora języka

Pola zawierające ciągi w różnych językach mogą używać analizatora języka, a inne pola zachowują wartość domyślną (lub używają innych wstępnie zdefiniowanych lub niestandardowych analizatorów). Jeśli używasz analizatora języka, musi być używany zarówno do indeksowania, jak i operacji wyszukiwania. Pola korzystające z analizatora języka nie mogą mieć różnych analizatorów do indeksowania i wyszukiwania.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
        {
           "name":"text_fr",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"fr.lucene"
        }
     ],
  }

Przykłady w języku C#

Jeśli używasz przykładów kodu zestawu .NET SDK, możesz dołączyć te przykłady do użycia lub skonfigurowania analizatorów.

Przypisywanie analizatora języka

Każdy analizator, który jest używany w takiej postaci, bez konfiguracji, jest określony w definicji pola. Nie ma potrzeby tworzenia wpisu w sekcji [analyzers] indeksu.

Analizatory języka są używane tak, jak jest. Aby ich używać, wywołaj metodę LexicalAnalyzer, określając typ LexicalAnalyzerName, podając analizator tekstu obsługiwany w usłudze Azure AI Search.

Analizatory niestandardowe są podobnie określone w definicji pola, ale aby to zadziałało, należy określić analizator w definicji indeksu, zgodnie z opisem w następnej sekcji.

    public partial class Hotel
    {
       . . . 
        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
        public string Description { get; set; }

        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
        [JsonPropertyName("Description_fr")]
        public string DescriptionFr { get; set; }

        [SearchableField(AnalyzerName = "url-analyze")]
        public string Url { get; set; }
      . . .
    }

Definiowanie analizatora niestandardowego

Gdy wymagane jest dostosowanie lub konfiguracja, dodaj konstrukcję analizatora do indeksu. Po zdefiniowaniu tej definicji można dodać ją do definicji pola, jak pokazano w poprzednim przykładzie.

Utwórz obiekt CustomAnalyzer. Analizator niestandardowy to zdefiniowana przez użytkownika kombinacja znanego tokenizatora, zera lub większej liczby filtrów tokenów oraz zero lub więcej nazw filtrów znaków:

W poniższym przykładzie tworzony jest niestandardowy analizator o nazwie "url-analyze", który używa tokenizatora uax_url_email i filtru tokenu małe litery.

private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{
   FieldBuilder fieldBuilder = new FieldBuilder();
   var searchFields = fieldBuilder.Build(typeof(Hotel));

   var analyzer = new CustomAnalyzer("url-analyze", "uax_url_email")
   {
         TokenFilters = { TokenFilterName.Lowercase }
   };

   var definition = new SearchIndex(indexName, searchFields);

   definition.Analyzers.Add(analyzer);

   adminClient.CreateOrUpdateIndex(definition);
}

Następne kroki

Szczegółowy opis wykonywania zapytań można znaleźć w artykule Wyszukiwanie pełnotekstowe w usłudze Azure AI Search. W artykule użyto przykładów, aby wyjaśnić zachowania, które mogą wydawać się intuicyjne na powierzchni.

Aby dowiedzieć się więcej o analizatorach, zobacz następujące artykuły: