Migliorare un indice con analizzatori e termini tokenizzati

Completato

Azure AI Search è configurato per impostazione predefinita per analizzare il testo e identificare i token che saranno utili nell'indice. I token corretti assicurano che gli utenti possano trovare rapidamente i documenti necessari. Nella maggior parte dei casi la configurazione predefinita produce un indice ottimale. Quando sono presenti campi insoliti o univoci, è tuttavia possibile configurare esattamente il modo in cui viene analizzato il testo.

In questa sezione si apprenderà come definire un analizzatore personalizzato per controllare il modo in cui il contenuto di un campo viene suddiviso in token per l'inclusione nell'indice.

Quando AI Search indicizza il contenuto, recupera il testo. Per creare un indice utile, con termini che consentono agli utenti di individuare i documenti, il testo deve essere elaborato. Ad esempio:

  • Il testo deve essere suddiviso in parole, spesso usando spazi vuoti e caratteri di punteggiatura come delimitatori.
  • Le parole non significative, ad esempio "il" e "lo", devono essere rimosse perché gli utenti non le cercano.
  • Le parole devono essere ridotte alla loro forma radice. Ad esempio, le forme passate del verbo, ad esempio "fui", devono essere sostituite con parole al presente, ad esempio "essere".

In AI Search questo tipo di elaborazione viene eseguito dagli analizzatori. Se non si specifica un analizzatore per un campo, viene usato l'analizzatore Lucene predefinito. L'analizzatore Lucene predefinito è una buona scelta per la maggior parte dei campi perché può elaborare molte lingue e restituire token utili per l'indice.

In alternativa, è possibile specificare uno degli analizzatori incorporati in AI Search. Gli analizzatori predefiniti sono di due tipi:

  • Analizzatori di linguaggi. Se sono necessarie funzionalità avanzate per linguaggi specifici, ad esempio lemmatizzazione, scomposizione di parole e riconoscimento di entità, usare un analizzatore del linguaggio predefinito. Microsoft offre 50 analizzatori per lingue diverse.
  • Analizzatori specializzati. Questi analizzatori sono indipendenti dal linguaggio e vengono usati per campi specializzati, ad esempio codici postali o ID prodotto. È possibile, ad esempio, usare PatternAnalyzer e specificare un'espressione regolare in modo che corrisponda ai separatori dei token.

Che cos'è un analizzatore personalizzato?

Gli analizzatori predefiniti offrono molte opzioni, ma a volte è necessario un analizzatore con un comportamento insolito per un campo. In questi casi è possibile creare un analizzatore personalizzato.

Un analizzatore personalizzato è costituito da:

  • Filtri di caratteri. Questi filtri elaborano una stringa prima che raggiunga il tokenizer.
  • Tokenizer. Questi componenti dividono il testo in token da aggiungere all'indice.
  • Filtri token. Questi filtri rimuovono o modificano i token generati dal tokenizer.

Verranno ora esaminati questi componenti in modo più dettagliato.

Filtri di caratteri

Potrebbe essere necessario completare alcune operazioni sul testo prima che venga suddiviso in token. I filtri di caratteri abilitano queste operazioni. Sono disponibili tre filtri di caratteri che è possibile usare:

  • html_strip. Questo filtro rimuove costrutti HTML, ad esempio tag e attributi.
  • Mapping. Questo filtro consente di specificare i mapping che sostituiscono una stringa con un'altra. Ad esempio, è possibile specificare un mapping che sostituisce TX con Texas.
  • pattern_replace. Questo filtro consente di specificare un'espressione regolare che identifica i criteri nel testo di input e la modalità di sostituzione del testo corrispondente.

Tokenizer

Il tokenizer è il componente che divide il testo nei token che verranno archiviati nell'indice. I tokenizer suddividono inoltre le parole nelle forme radice. Un token è spesso una singola parola, ma può essere necessario creare token insoliti, ad esempio:

  • Indirizzo postale completo.
  • URL o indirizzo di posta elettronica completo.
  • Parole basate sulla grammatica di una lingua specifica.

Sono disponibili 13 tokenizer diversi tra cui scegliere. Questi tokenizer includono:

  • Classico. Questo tokenizer elabora il testo in base alla grammatica per le lingue europee.
  • keyword. Questo tokenizer genera l'intero input come singolo token. Usare questo tokenizer per i campi che devono essere sempre indicizzati come un valore.
  • Minuscolo. Questo tokenizer divide il testo in corrispondenza di caratteri diversi da lettere e quindi modifica i token risultanti in modo che siano tutti in lettere minuscole.
  • microsoft_language_tokenizer. Questo tokenizer divide il testo in base alla grammatica della lingua specificata.
  • Criterio. Questo tokenizer divide i testi nel punto in cui rileva la corrispondenza con un'espressione regolare specificata.
  • Spazio vuoto. Questo tokenizer divide il testo ovunque ci sia uno spazio vuoto.

Nota

Per un elenco completo dei tokenizer, vedere Aggiungere analizzatori personalizzati ai campi stringa in un indice di Azure AI Search nella sezione Altre informazioni disponibile di seguito.

Filtri di token

Dopo che il tokenizer ha diviso il testo in ingresso in token, è possibile aggiungere alcune elaborazioni aggiuntive, ad esempio la rimozione di parole non significative o di segni di punteggiatura. È possibile eseguire questa elaborazione specificando un filtro token. Sono disponibili quaranta filtri token diversi, tra cui:

  • Filtri specifici di una lingua, ad esempio arabic_normalization. Questi filtri applicano regole grammaticali specifiche di una lingua per garantire che le forme declinate delle parole vengano rimosse e sostituite con radici.
  • Apostrofo. Questo filtro rimuove qualsiasi apostrofo da un token ed eventuali caratteri dopo l'apostrofo.
  • Classico. Questo filtro rimuove i possessivi inglesi e i punti inglesi dagli acronimi.
  • Mantieni. Questo filtro rimuove tutti i token che non includono una o più parole da un elenco specificato.
  • Lunghezza. Questo filtro rimuove qualsiasi token più lungo del valore minimo specificato o più breve rispetto al valore massimo specificato.
  • Ritaglio. Questo filtro rimuove tutti gli spazi vuoti iniziali e finali dai token.

Nota

Per un elenco completo dei filtri token, vedere Aggiungere analizzatori personalizzati ai campi stringa in un indice di Azure AI Search nella sezione Altre informazioni disponibile di seguito.

Creare un analizzatore personalizzato

Per creare un analizzatore personalizzato, specificarlo quando si definisce l'indice. È necessario eseguire questa operazione con il codice JSON. Non è possibile specificare un indice personalizzato nel portale di Azure. Usare la sezione analyzers dell'indice in fase di progettazione. È possibile includere un solo tokenizer, ma sono consentiti uno o più filtri di caratteri e uno o più filtri token. Usare un nome univoco per l'analizzatore e impostare la proprietà @odata.type su Microsoft.Azure.Search.CustomAnalyzer.

In questo esempio un filtro di caratteri rimuove la formattazione HTML, un tokenizer suddivide il testo in base alla grammatica islandese e un filtro token rimuove gli apostrofi:

"analyzers":(optional)[
   {
      "name":"ContosoAnalyzer",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "charFilters":[
         "WebContentRemover"
      ],
      "tokenizer":"IcelandicTokenizer",
      "tokenFilters":[
         "ApostropheFilter"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"WebContentRemover",
      "@odata.type":"#html_strip"
   }
],
"tokenizers":(optional)[
   {
      "name":"IcelandicTokenizer",
      "@odata.type":"#microsoft_language_tokenizer",
      "language":"icelandic",
      "isSearchTokenizer":false,
   }
],
"tokenFilters":(optional)[
   {
      "name":"ApostropheFilter",
      "@odata.type":"#apostrophe"
   }
]

Testare un analizzatore personalizzato

Dopo aver definito l'analizzatore personalizzato come parte dell'indice, è possibile usare la funzione Analizza il testo dell'API REST per inviare testo di prova e assicurarsi che l'analizzatore restituisca correttamente i token. Usare qualsiasi strumento di test di REST per formulare queste richieste, ad esempio l'applicazione Postman molto diffusa.

Le richieste REST di prova dovrebbero avere un aspetto simile al seguente:

POST https://<search service name>.search.windows.net/indexes/<index name>/analyze?api-version=<api-version>
   Content-Type: application/json
   api-key: <api key>

In questa richiesta:

  • Sostituire <search service name> con il nome della risorsa di AI Search.
  • Sostituire <index name> con il nome dell'indice che include l'analizzatore personalizzato.
  • Sostituire <api-version> con il numero di versione dell'API REST.
  • Sostituire <api-key> con la chiave di accesso per la risorsa di AI Search. È possibile ottenere questa chiave nel portale di Azure.

La richiesta deve includere anche un corpo JSON simile al seguente:

{
  "text": "Test text to analyze.",
  "analyzer": "<analyzer name>"
}

Sostituire <analyzer name> con il nome specificato quando è stato definito l'analizzatore personalizzato. Assicurarsi di testare con molti valori di text diversi fino a quando non si è certi che l'analizzatore personalizzato si comporti come previsto.

Usare un analizzatore personalizzato per un campo

Dopo aver definito e testato un analizzatore personalizzato, è possibile configurare l'indice per usarlo. È possibile specificare un analizzatore per ogni campo nell'indice.

È possibile usare il campo analyzer quando si vuole usare lo stesso analizzatore sia per l'indicizzazione che per la ricerca:

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": "ContosoAnalyzer",
   "indexAnalyzer": null,
   "searchAnalyzer": null
 },

È anche possibile usare un analizzatore diverso durante l'indicizzazione del campo e durante la ricerca nel campo. Usare questa configurazione se è necessario un set diverso di passaggi di elaborazione quando si indicizza un campo rispetto a quando si analizza una query:

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": null,
   "indexAnalyzer": "ContosoIndexAnalyzer",
   "searchAnalyzer": "ContosoSearchAnalyzer"
 },