Normalizzazione del testo per i filtri senza distinzione tra maiuscole e minuscole, facet e ordinamento

Importante

Questa funzionalità è disponibile in anteprima pubblica in Condizioni supplementari per l'utilizzo. L'API REST di anteprima supporta questa funzionalità.

In Ricerca di intelligenza artificiale di Azure un normalizzatore è un componente che pre-elabora il testo per la corrispondenza delle parole chiave sui campi contrassegnati come "filtrabili", "facetable" o "ordinabili". A differenza dei campi "ricercabili" full-text associati agli analizzatori di testo, il contenuto creato per le operazioni di ordinamento di facet filtro non viene sottoposto a analisi o tokenizzazione. L'omissione dell'analisi del testo può produrre risultati imprevisti quando vengono visualizzate le differenze tra maiuscole e minuscole e caratteri, motivo per cui è necessario un normalizzatore per omogeneizzare le variazioni nel contenuto.

Applicando un normalizzatore, è possibile ottenere trasformazioni di testo chiaro che migliorano i risultati:

  • Maiuscole e minuscole coerenti ( ad esempio tutte minuscole o maiuscole)
  • Normalizzare accenti e diacritici come ö o ê in caratteri equivalenti ASCII "o" e "e"
  • Mappare caratteri come - e spazi vuoti in un carattere specificato dall'utente

Vantaggi dei normalizzatori

La ricerca e il recupero di documenti da un indice di ricerca richiede la corrispondenza dell'input della query al contenuto del documento. La corrispondenza è basata sul contenuto con token, come nel caso in cui si richiama "search" o su contenuto non tokenizzato se la richiesta è un filtro, un facet o un'operazione orderby .

Poiché anche il contenuto non tokenizzato non viene analizzato, le piccole differenze nel contenuto vengono valutate come valori distintimente diversi. Vedi gli esempi seguenti:

  • $filter=City eq 'Las Vegas' restituirà solo i documenti che contengono il testo "Las Vegas" esatto ed escluderanno i documenti con "LAS VEGAS" e "las vegas", che è inadeguato quando il caso d'uso richiede tutti i documenti indipendentemente dalla combinazione di maiuscole e minuscole.

  • search=*&facet=City,count:5 restituirà "Las Vegas"e "LAS VEGAS""las vegas" come valori distinti nonostante sia la stessa città.

  • search=usa&$orderby=City restituirà le città in ordine lessicografico: "Las Vegas", "Seattle", "las vegas", , anche se lo scopo è ordinare le stesse città insieme indipendentemente dal caso.

Un normalizzatore, richiamato durante l'indicizzazione e l'esecuzione di query, aggiunge trasformazioni leggere che consentono di uniformare le piccole differenze nel testo per scenari di filtro, facet e ordinamento. Negli esempi precedenti le varianti di "Las Vegas" verrebbero elaborate in base al normalizzatore selezionato (ad esempio, tutto il testo è minuscolo) per ottenere risultati più uniformi.

Come specificare un normalizzatore

I normalizzatori vengono specificati in una definizione di indice, in base ai campi di testo (Edm.String e Collection(Edm.String)) con almeno una proprietà "filtrabile", "ordinabile" o "facetable" impostata su true. L'impostazione di un normalizzatore è facoltativa ed è null per impostazione predefinita. È consigliabile valutare i normalizzatori predefiniti prima di configurarne uno personalizzato.

I normalizzatori possono essere specificati solo quando si aggiunge un nuovo campo all'indice, quindi, se possibile, provare a valutare le esigenze di normalizzazione prima e assegnare normalizzatori nelle fasi iniziali dello sviluppo durante l'eliminazione e la ricreazione degli indici è routine.

  1. Quando si crea una definizione di campo nell'indice, impostare la proprietà "normalizer" su uno dei valori seguenti: un normalizzatore predefinito, ad esempio "minuscolo" o un normalizzatore personalizzato (definito nello stesso schema di indice).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. I normalizzatori personalizzati vengono definiti nella sezione "normalizer" dell'indice e quindi assegnati alla definizione del campo, come illustrato nel passaggio precedente. Per altre informazioni, vedere Creare un indice e aggiungere normalizzatori personalizzati.

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

Nota

Per modificare il normalizzatore di un campo esistente, ricompilare completamente l'indice (non è possibile ricompilare singoli campi).

Una buona soluzione alternativa per gli indici di produzione, in cui la ricompilazione degli indici è costosa, consiste nel creare un nuovo campo identico a quello precedente, ma con il nuovo normalizzatore e usarlo al posto di quello precedente. Usare Aggiornare un indice per incorporare il nuovo campo e mergeOrUpload per compilarlo. In un secondo momento, nell'ambito della manutenzione pianificata dell'indice, sarà possibile pulire l'indice per rimuovere i campi obsoleti.

Normalizzatori predefiniti e personalizzati

Ricerca di intelligenza artificiale di Azure offre normalizzatori predefiniti per i casi d'uso comuni e la possibilità di personalizzare in base alle esigenze.

Categoria Descrizione
Normalizzatori predefiniti Fornito out-of-the-box e può essere usato senza alcuna configurazione.
Normalizzatoripersonalizzati 1 Per scenari avanzati. Richiede la configurazione definita dall'utente di una combinazione di elementi esistenti, costituiti da filtri char e token.

(1) I normalizzatori personalizzati non specificano tokenizzatori perché i normalizzatori producono sempre un singolo token.

Informazioni di riferimento su Normalizer

Normalizzatori predefiniti

Nome Descrizione e opzioni
standard Minuscole il testo seguito dalla asciifolding.
lowercase Trasforma i caratteri in lettere minuscole.
uppercase Trasforma i caratteri in maiuscolo.
asciifolding Trasforma i caratteri che non si trovano nel blocco Unicode latino di base nell'equivalente ASCII, se presente. Ad esempio, passando à a a.
elision Rimuove l'elisione dall'inizio dei token.

Filtri char supportati

I normalizzatori supportano due filtri di caratteri identici alle rispettive controparti nei filtri dei caratteri dell'analizzatore personalizzato:

Filtri di token supportati

L'elenco seguente mostra i filtri di token supportati per i normalizzatori ed è un subset dei filtri di token complessivi usati negli analizzatori personalizzati.

Aggiungere normalizzatori personalizzati

I normalizzatori personalizzati vengono definiti all'interno dello schema dell'indice. La definizione include un nome, un tipo, uno o più filtri di caratteri e filtri token. I filtri di caratteri e i filtri dei token sono i blocchi predefiniti per un normalizzatore personalizzato e responsabili dell'elaborazione del testo. Questi filtri vengono applicati da sinistra a destra.

token_filter_name_1 è il nome del filtro del token e char_filter_name_2char_filter_name_1 sono i nomi dei filtri char (vedere filtri di token supportati e tabelle di filtrichar supportati di seguito per i valori validi).

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

I normalizzatori personalizzati possono essere aggiunti durante la creazione dell'indice o versioni successive aggiornando uno esistente. Per aggiungere un normalizzatore personalizzato a un indice esistente è necessario specificare il flag "allowIndexDowntime" in Update Index e l'indice non sarà disponibile per alcuni secondi.

Esempio di normalizzatore personalizzato

L'esempio seguente illustra una definizione di normalizzatore personalizzata con filtri di caratteri e filtri token corrispondenti. Le opzioni personalizzate per i filtri di caratteri e i filtri token vengono specificate separatamente come costrutti denominati e quindi viene fatto riferimento nella definizione di normalizer, come illustrato di seguito.

  • Nella sezione "normalizer" della definizione dell'indice viene definito un normalizzatore personalizzato denominato "my_custom_normalizer".

  • Il normalizer è composto da due filtri di caratteri e tre filtri di token: elisione, minuscola e filtro di asciifolding personalizzato "my_asciifolding".

  • Il primo filtro di caratteri "map_dash" sostituisce tutti i trattini con caratteri di sottolineatura mentre il secondo "remove_whitespace" rimuove tutti gli spazi.

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

Vedi anche