Läs på engelska

Dela via


Textnormalisering för skiftlägesokänslig filtrering, fasettering och sortering

Viktigt

Den här funktionen är i offentlig förhandsversion under kompletterande användningsvillkor. REST API för förhandsversion stöder den här funktionen.

I Azure AI Search är en normaliserare en komponent som förbehandlar text för nyckelordsmatchning över fält som markerats som "filterable", "facetable" eller "sortable". Till skillnad från "sökbara" fält i fulltext som är kopplade till textanalysverktyg genomgår innehåll som skapats för filter-fasettsorteringsåtgärder inte analys eller tokenisering. Utelämnande av textanalys kan ge oväntade resultat när skillnader mellan höljen och tecken visas, vilket är anledningen till att du behöver en normaliserare för att homogenisera variationer i ditt innehåll.

Genom att använda en normaliserare kan du uppnå ljustexttransformeringar som förbättrar resultatet:

  • Konsekvent hölje (till exempel alla gemener eller versaler)
  • Normalisera accenter och diakritiska tecken som ö eller ê till ASCII-motsvarande tecken "o" och "e"
  • Mappa tecken som - och blanksteg till ett användardefingivet tecken

Fördelar med normaliserare

Sökning och hämtning av dokument från ett sökindex kräver att frågeindata matchas med innehållet i dokumentet. Matchning sker antingen över tokeniserat innehåll, vilket är fallet när du anropar "sök" eller över icke-tokeniserat innehåll om begäran är en filter-, fasett- eller orderby-åtgärd.

Eftersom icke-tokeniserat innehåll inte heller analyseras utvärderas små skillnader i innehållet som tydligt olika värden. Föreställ dig följande exempel:

  • $filter=City eq 'Las Vegas' returnerar endast dokument som innehåller den exakta texten "Las Vegas" och exkluderar dokument med "LAS VEGAS" och "las vegas", vilket är otillräckligt när användningsfallet kräver alla dokument oavsett hölje.

  • search=*&facet=City,count:5 returnerar "Las Vegas", "LAS VEGAS" och "las vegas" som distinkta värden trots att de är samma stad.

  • search=usa&$orderby=City kommer att returnera städerna i lexikal ordning: "Las Vegas", "Seattle", "las vegas", även om avsikten är att beställa samma städer tillsammans oavsett fallet.

En normaliserare, som anropas under indexering och frågekörning, lägger till ljustransformeringar som jämnar ut mindre skillnader i text för filter-, fasetterings- och sorteringsscenarier. I föregående exempel bearbetas varianterna av "Las Vegas" enligt den normaliserare du väljer (till exempel är all text gemen) för mer enhetliga resultat.

Så här anger du en normaliserare

Normaliserare anges i en indexdefinition, per fält, på textfält (Edm.String och Collection(Edm.String)) som har minst en av egenskaperna "filterable", "sortable" eller "facetable" inställd på true. Att ange en normalizer är valfritt och är null som standard. Vi rekommenderar att du utvärderar fördefinierade normaliserare innan du konfigurerar en anpassad.

Normaliserare kan bara anges när du lägger till ett nytt fält i indexet, så om möjligt kan du försöka utvärdera normaliseringsbehoven i förväg och tilldela normaliserare i de inledande utvecklingsstegen när du släpper och återskapar index är rutin.

  1. När du skapar en fältdefinition i indexet anger du egenskapen "normalizer" till något av följande värden: en fördefinierad normaliserare, till exempel "gemener" eller en anpassad normaliserare (definierad i samma indexschema).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Anpassade normaliserare definieras först i avsnittet "normalizers" i indexet och tilldelas sedan till fältdefinitionen enligt föregående steg. Mer information finns i Skapa index och även Lägg till anpassade normaliserare.

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

Anteckning

Om du vill ändra normaliseraren för ett befintligt fält återskapar du indexet helt (du kan inte återskapa enskilda fält).

En bra lösning för produktionsindex, där det är dyrt att återskapa index, är att skapa ett nytt fält som är identiskt med det gamla men med den nya normaliseraren och använda det i stället för det gamla. Använd Uppdateringsindex för att införliva det nya fältet och mergeOrUpload för att fylla i det. Senare, som en del av den planerade indexservicen, kan du rensa indexet för att ta bort föråldrade fält.

Fördefinierade och anpassade normaliserare

Azure AI Search tillhandahåller inbyggda normaliserare för vanliga användningsfall tillsammans med möjligheten att anpassa efter behov.

Kategori beskrivning
Fördefinierade normaliserare Tillhandahålls out-of-the-box och kan användas utan konfiguration.
Anpassade normaliserare 1 För avancerade scenarier. Kräver användardefinierad konfiguration av en kombination av befintliga element som består av tecken- och tokenfilter.

(1) Anpassade normaliserare anger inte tokenizers eftersom normaliserare alltid skapar en enda token.

Referens för normaliserare

Fördefinierade normaliserare

Namn Beskrivning och alternativ
standard Ge gemener texten följt av asciifolding.
gemen Omvandlar tecken till gemener.
versal Omvandlar tecken till versaler.
asciifolding Omvandlar tecken som inte finns i Basic Latin Unicode-blocket till deras ASCII-motsvarighet, om det finns en sådan. Du kan till exempel ändra à till a.
elision Tar bort elision från början av token.

Teckenfilter som stöds

Normaliserare stöder två teckenfilter som är identiska med deras motsvarigheter i anpassade filter för analysverktygstecken:

Tokenfilter som stöds

Listan nedan visar de tokenfilter som stöds för normalizers och är en delmängd av de övergripande tokenfilter som används i anpassade analysverktyg.

Lägga till anpassade normaliserare

Anpassade normaliserare definieras i indexschemat. Definitionen innehåller ett namn, en typ, ett eller flera teckenfilter och tokenfilter. Teckenfilter och tokenfilter är byggstenarna för en anpassad normaliserare och ansvarar för bearbetningen av texten. Dessa filter tillämpas från vänster till höger.

token_filter_name_1 är namnet på tokenfiltret och char_filter_name_2 char_filter_name_1 är namnen på teckenfilter (se tokenfilter som stöds och tabeller med teckenfiltersom stöds nedan för giltiga värden).

"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",
      ...
   }
]

Anpassade normalizers kan läggas till när index skapas eller senare genom att uppdatera en befintlig. Om du lägger till en anpassad normaliserare i ett befintligt index måste flaggan "allowIndexDowntime" anges i Uppdateringsindex och gör att indexet inte är tillgängligt i några sekunder.

Exempel på anpassad normaliserare

Exemplet nedan illustrerar en anpassad normaliserardefinition med motsvarande teckenfilter och tokenfilter. Anpassade alternativ för teckenfilter och tokenfilter anges separat som namngivna konstruktioner och refereras sedan i normalizerdefinitionen enligt nedan.

  • En anpassad normaliserare med namnet "my_custom_normalizer" definieras i avsnittet "normalizers" i indexdefinitionen.

  • Normaliseraren består av två teckenfilter och tre tokenfilter: elision, gemener och anpassat asciifolding-filter "my_asciifolding".

  • Det första teckenfiltret "map_dash" ersätter alla bindestreck med understreck medan det andra "remove_whitespace" tar bort alla blanksteg.

  {
     "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
        }
     ]
  }

Se även