Sdílet prostřednictvím


Normalizace textu pro filtrování bez rozlišování velkých a velkých písmen, faset a řazení

Důležité

Tato funkce je ve veřejné verzi Preview v rámci dodatečných podmínek použití. Rozhraní REST API ve verzi Preview tuto funkci podporuje.

Ve službě Azure AI Search je normalizátor komponentou, která předem zpracuje text pro porovnávání klíčových slov nad poli označenými jako "filtrovatelná", "facetable" nebo "sortable". Na rozdíl od "prohledávatelných" polí, která jsou spárovaná s analyzátory textu, obsah vytvořený pro operace filtrování faset-řazení neprochází analýzou ani tokenizací. Vynechání analýzy textu může vést k neočekávaným výsledkům, když se zobrazí rozdíly velikosti písmen a znaků, což je důvod, proč potřebujete normalizátor pro homogenizaci variací v obsahu.

Použitím normalizátoru můžete dosáhnout světlých transformací textu, které zlepšují výsledky:

  • Konzistentní velikost písmen (například všechna malá písmena nebo velká písmena)
  • Normalizace zvýrazňujících a diakritických znamének, jako je ö nebo ê, na ekvivalentní znaky ASCII "o" a "e"
  • Mapování znaků jako - a prázdných znaků na znak zadaný uživatelem

Výhody normalizátorů

Vyhledávání a načítání dokumentů z indexu vyhledávání vyžaduje, aby odpovídal vstupu dotazu s obsahem dokumentu. Porovnávání je buď nad tokenizovaným obsahem, stejně jako v případě, že vyvoláte "vyhledávání", nebo nad obsahem, který není tokenizovaný, pokud je požadavek filtrem, omezující vlastností nebo operací orderby .

Vzhledem k tomu, že se neanalyzuje také ne tokenizovaný obsah, vyhodnocují se malé rozdíly v obsahu jako odlišné hodnoty. Zvažte následující příklady:

  • $filter=City eq 'Las Vegas' vrátí pouze dokumenty, které obsahují přesný text "Las Vegas" a vyloučí dokumenty a "LAS VEGAS" "las vegas"které jsou nedostatečné, pokud případ použití vyžaduje všechny dokumenty bez ohledu na velikost písmen.

  • search=*&facet=City,count:5 vrátí "Las Vegas"hodnotu a "LAS VEGAS" "las vegas" jako jedinečné hodnoty i přes to, že je stejné město.

  • search=usa&$orderby=Cityvrátí města v lexikografickém pořadí: "Las Vegas", "Seattle""las vegas", , i když záměr je uspořádat stejná města dohromady bez ohledu na případ.

Normalizátor, který se vyvolá během indexování a provádění dotazů, přidává světlé transformace, které vyhladí drobné rozdíly v textu pro scénáře filtrování, omezující vlastnosti a řazení. V předchozích příkladech by se varianty zpracovávaly podle vybraného normalizátoru (například všechny texty "Las Vegas" jsou malé) pro jednotnější výsledky.

Určení normalizátoru

Normalizátory se zadají v definici indexu na základě jednotlivých polí na textová pole (Edm.String a Collection(Edm.String)) s alespoň jednou z "filtrovatelných", "sortable" nebo "facetable" vlastností nastavenou na true. Nastavení normalizátoru je volitelné a ve výchozím nastavení má hodnotu null. Před konfigurací vlastního normalizátoru doporučujeme vyhodnotit předdefinované normalizátory.

Normalizátory je možné zadat pouze v případě, že do indexu přidáte nové pole, takže pokud je to možné, zkuste nejprve posoudit normalizaci a přiřaďte normalizátory v počátečních fázích vývoje při vyřazení a opětovném vytvoření indexů je rutinní.

  1. Při vytváření definice pole v indexu nastavte vlastnost normalizer na jednu z následujících hodnot: předdefinovaný normalizátor, například "malá písmena" nebo vlastní normalizátor (definovaný ve stejném schématu indexu).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Vlastní normalizátory jsou nejprve definovány v části "normalizátory" indexu a pak jsou přiřazeny k definici pole, jak je znázorněno v předchozím kroku. Další informace naleznete v tématu Vytvoření indexu a také Přidání vlastních normalizátorů.

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "normalizer": "my_custom_normalizer"
     },
    

Poznámka:

Chcete-li změnit normalizátor existujícího pole, znovu sestavte index zcela (nelze znovu sestavit jednotlivá pole).

Dobrým alternativním řešením pro produkční indexy, kde je opětovné sestavení indexů nákladné, je vytvořit nové pole shodné se starým, ale s novým normalizátorem a použít ho místo starého. Pomocí funkce Update Index začleníte nové pole a mergeOrUpload ho naplníte. Později můžete v rámci plánované údržby indexů vyčistit index a odebrat zastaralá pole.

Předdefinované a vlastní normalizátory

Azure AI Search poskytuje integrované normalizátory pro běžné případy použití spolu s možností přizpůsobení podle potřeby.

Kategorie Popis
Předdefinované normalizátory Poskytuje se bez jakékoli konfigurace a dá se použít bez jakékoli konfigurace.
Vlastní normalizátory 1 V případě pokročilých scénářů. Vyžaduje uživatelsky definovanou konfiguraci kombinace existujících prvků, která se skládá z filtrů znaků a tokenů.

(1) Vlastní normalizátory nezadávají tokenizátory, protože normalizátory vždy vytvářejí jeden token.

Referenční dokumentace normalizátorů

Předdefinované normalizátory

Název Popis a možnosti
standard Malá písmena text následovaný asciifolding.
malými písmeny Transformuje znaky na malá písmena.
napsaný velkými písmeny Transformuje znaky na velká písmena.
asciifolding Transformuje znaky, které nejsou v bloku Základní latinka Unicode, na jejich ekvivalent ASCII, pokud existuje. Například změna à na a.
elize Odebere elizi ze začátku tokenů.

Podporované filtry znaků

Normalizátory podporují dva filtry znaků, které jsou identické s jejich protějšky ve filtrech vlastních znaků analyzátoru:

Podporované filtry tokenů

Následující seznam ukazuje filtry tokenů podporované pro normalizátory a je podmnožinou celkových filtrů tokenů používaných ve vlastních analyzátorech.

Přidání vlastních normalizátorů

Vlastní normalizátory jsou definovány v rámci schématu indexu. Definice obsahuje název, typ, jeden nebo více filtrů znaků a filtry tokenů. Filtry znaků a filtry tokenů jsou stavební bloky vlastního normalizátoru a zodpovídají za zpracování textu. Tyto filtry se použijí zleva doprava.

Jedná se token_filter_name_1 o název filtru tokenů a char_filter_name_1 char_filter_name_2 jedná se o názvy filtrů znaků (viz podporované filtry tokenů a tabulky podporovaných filtrůznaků níže pro platné hodnoty).

"normalizers":(optional)[
   {
      "name":"name of normalizer",
      "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
      "charFilters":[
         "char_filter_name_1",
         "char_filter_name_2"
      ],
      "tokenFilters":[
         "token_filter_name_1"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"char_filter_name_1",
      "@odata.type":"#char_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
],
"tokenFilters":(optional)[
   {
      "name":"token_filter_name_1",
      "@odata.type":"#token_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
]

Vlastní normalizátory je možné přidat během vytváření indexu nebo později aktualizací existujícího. Přidání vlastního normalizátoru do existujícího indexu vyžaduje, aby byl v indexu aktualizace zadán příznak allowIndexDowntime a index bude několik sekund nedostupný.

Příklad vlastního normalizátoru

Následující příklad znázorňuje vlastní definici normalizátoru s odpovídajícími filtry znaků a filtry tokenů. Vlastní možnosti pro filtry znaků a filtry tokenů se zadají samostatně jako pojmenované konstrukce a pak se na to odkazují v definici normalizátoru, jak je znázorněno níže.

  • Vlastní normalizátor s názvem "my_custom_normalizer" je definován v části "normalizers" definice indexu.

  • Normalizátor se skládá ze dvou filtrů znaků a tří filtrů tokenů: elision, malá písmena a přizpůsobený filtr asciifolding "my_asciifolding".

  • První znakový filtr "map_dash" nahradí všechny pomlčky podtržítkami, zatímco druhý znak "remove_whitespace" odebere všechny mezery.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false,
        },
        {
           "name":"city",
           "type":"Edm.String",
           "filterable": true,
           "facetable": true,
           "normalizer": "my_custom_normalizer"
        }
     ],
     "normalizers":[
        {
           "name":"my_custom_normalizer",
           "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenFilters":[              
              "my_asciifolding",
              "elision",
              "lowercase",
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Viz také