Migliorare la classificazione di un documento con il boosting dei termini

Completato

La ricerca funziona meglio quando vengono visualizzati per primi i risultati più rilevanti. Tutti i motori di ricerca cercano di restituire i risultati più rilevanti per le query di ricerca. Azure AI Search implementa una versione avanzata di Apache Lucene per la ricerca full-text.

In questa unità verrà illustrato come scrivere query Lucene più complesse. Si migliorerà quindi la pertinenza dei risultati tramite il boosting di termini specifici nella query di ricerca.

Eseguire la ricerca in un indice

Azure AI Search consente di eseguire query su un indice usando un endpoint REST o all'interno del portale di Azure con lo strumento Esplora ricerche. Per un riepilogo rapido delle fasi di elaborazione delle query, vedere l'unità Indice di ricerca in Creare una soluzione di Azure AI Search.

A diagram showing the four stages of query processing.

Questa unità è incentrata sull'analisi delle query.

Si userà Esplora ricerche per vedere la differenza tra l'uso dei tipi di query semplice e completo e come cambiano i risultati della ricerca.

Nota

Se si vogliono eseguire le query in autonomia, è necessaria una sottoscrizione di Azure. Creare un servizioAzure AI Search e importare i dati di esempio degli hotel in un indice.

Scrivere una query semplice

I dati di esempio degli hotel contengono 50 hotel con descrizioni, dettagli delle camere e relative posizioni. Si supponga di essere il titolare di un azienda che si occupa di prenotazioni alberghiere e di avere un'app con cui gli utenti possono prenotare gli hotel. Gli utenti possono eseguire ricerche e gli hotel più rilevanti devono essere visualizzati per primi.

Si supponga di dover lavorare a un caso d'uso in cui un cliente sta cercando un hotel di lusso. Per iniziare, esaminare i risultati della ricerca da questa semplice query:

search=luxury&$select=HotelId, HotelName, Category, Tags, Description&$count=true

La query di analisi cercherà il termine luxury in tutti i campi per un documento nell'indice.

La stringa di query limita anche i campi restituiti dai documenti aggiungendo l'opzione select.

&$select=HotelId, HotelName, Category, Tags, Description

L'ultimo parametro nella query chiede all'indice di contare i risultati totali.

$count=true

Non è necessaria alcuna analisi lessicale, quindi il recupero dei documenti restituisce 14 documenti. I primi tre sono:

{
  "@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
  "@odata.count": 14,
  "value": [
    {
      "@search.score": 2.633778,
      "HotelId": "13",
      "HotelName": "Historic Lion Resort",
      "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
      "Category": "Budget",
      "Tags": [
        "view",
        "free wifi",
        "free wifi"
      ]
    },
    {
      "@search.score": 2.1104424,
      "HotelId": "18",
      "HotelName": "Oceanside Resort",
      "Description": "New Luxury Hotel.  Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
      "Category": "Budget",
      "Tags": [
        "view",
        "laundry service",
        "air conditioning"
      ]
    },
    {
      "@search.score": 1.966516,
      "HotelId": "40",
      "HotelName": "Trails End Motel",
      "Description": "Only 8 miles from Downtown.  On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport.",
      "Category": "Luxury",
      "Tags": [
        "continental breakfast",
        "view",
        "view"
      ]
    },
    ...
  ]
}

Il cliente potrebbe essere sorpreso di notare che il primo hotel che dovrebbe essere di lusso (luxury) rientra nella categoria degli hotel economici (budget) e non ha l'aria condizionata. Se il cliente immette più parole nella ricerca, l'app presuppone che tutti i termini debbano essere inclusi nei risultati, quindi aggiunge + tra termini alla query. La query inviata all'API è:

search=luxury + air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true

Il servizio di ricerca restituisce ora cinque documenti, ma ancora una volta i primi risultati rientrano nella categoria economica.

Abilitare il parser di query Lucene

È possibile indicare a Esplora ricerche di usare il parser di query Lucene aggiungendo &queryType=full alla stringa di query.

search=luxury AND air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full

Con la sintassi Lucene è possibile scrivere query più precise. Ecco un riepilogo delle funzionalità disponibili:

  • Operatori booleani: AND, OR, NOT, ad esempio luxury AND 'air con'
  • Ricerca con specifica del campo: fieldName:search term, ad esempio Description:luxury AND Tags:air con
  • Ricerca fuzzy: ~, ad esempio Description:luxury~ restituisce risultati con versioni con errori di ortografia di luxury
  • Ricerca per prossimità di termini: "term1 term2"~n, ad esempio "indoor swimming pool"~3 restituisce i documenti in cui le parole indoor swimming pool compaiono entro 3 parole di distanza l'una dell'altra
  • Ricerca di espressioni regolari: /regular expression/, usare un'espressione regolare tra /, ad esempio /[mh]otel/ restituirebbe i documenti con hotel e motel
  • Ricerca con caratteri jolly: *, ? dove * corrisponderà a molti caratteri e ? corrisponde a un singolo carattere, ad esempio 'air con'* troverebbe "air con" e "air conditioning"
  • Raggruppamento con precedenza: (term AND (term OR term)), ad esempio (Description:luxury OR Category:luxury) AND Tags:air?con*
  • Boosting dei termini: ^, ad esempio Description:luxury OR Category:luxury^3 assegnerebbe agli hotel con la categoria luxury un punteggio superiore rispetto a quelli con luxury nella descrizione

Per altri dettagli su queste funzionalità, vedere Sintassi delle query Lucene in Azure AI Search nella documentazione.

Boosting dei termini di ricerca

Le tecniche precedenti possono migliorare i risultati. Il parser deve dare una priorità più alta agli hotel nella categoria di lusso. È anche possibile essere più precisi e cercare l'aria condizionata nel campo Tag.

(Description:luxury OR Category:luxury^3) AND Tags:'air con'*

Aggiungendo gli altri parametri per la stringa di query si ottiene questa stringa di query:

search=(Description:luxury OR Category:luxury^3) AND Tags:'air con'*&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full

I primi tre hotel sono ora:

{
  "@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
  "@odata.count": 5,
  "value": [
    {
      "@search.score": 5.3537707,
      "HotelId": "8",
      "HotelName": "Sapphire Resort",
      "Description": "Downtown, close to everything, steps to the park, shopping, and restaurants.",
      "Category": "Luxury",
      "Tags": [
        "free wifi",
        "continental breakfast",
        "air conditioning"
      ]
    },
    {
      "@search.score": 5.3522806,
      "HotelId": "49",
      "HotelName": "Old Carrabelle Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
      "Category": "Luxury",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 4.1448884,
      "HotelId": "18",
      "HotelName": "Oceanside Resort",
      "Description": "New Luxury Hotel.  Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
      "Category": "Budget",
      "Tags": [
        "view",
        "laundry service",
        "air conditioning"
      ]
    },
    ...
  ]
}

Il punteggio di ricerca di Sapphire Resorts è aumentato da 2,3321536 a 5,3537707 ed è ora il primo hotel che il cliente vedrà. Oceanside Resort è ora al terzo posto.