Funzionamento della ricerca full-text in Ricerca di AzureHow full text search works in Azure Search

Questo articolo si rivolge agli sviluppatori che hanno bisogno di una conoscenza più approfondita circa il funzionamento della ricerca full-text di Lucene in Ricerca di Azure.This article is for developers who need a deeper understanding of how Lucene full text search works in Azure Search. Per le query di testo, Ricerca di Azure fornirà i risultati previsti nella maggior parte degli scenari, ma in alcuni casi è possibile ottenere un risultato che sembrerà in qualche modo "strano".For text queries, Azure Search will seamlessly deliver expected results in most scenarios, but occasionally you might get a result that seems "off" somehow. In questi casi, la presenza di uno sfondo nelle quattro fasi dell'esecuzione di query di Lucene (analisi delle query, analisi lessicale, abbinamento dei documenti, assegnazione dei punteggi) consente di identificare le modifiche specifiche per i parametri di query o per la configurazione di indice che garantirà il risultato desiderato.In these situations, having a background in the four stages of Lucene query execution (query parsing, lexical analysis, document matching, scoring) can help you identify specific changes to query parameters or index configuration that will deliver the desired outcome.

Nota

Ricerca di Azure usa Lucene per la ricerca full-text, ma l'integrazione con Lucene non è completa.Azure Search uses Lucene for full text search, but Lucene integration is not exhaustive. Si espone in modo selettivo e si estende la funzionalità di Lucene per abilitare gli scenari importanti per Ricerca di Azure.We selectively expose and extend Lucene functionality to enable the scenarios important to Azure Search.

Panoramica e diagramma dell'architetturaArchitecture overview and diagram

L'elaborazione di una query di ricerca full-text inizia con l'analisi del testo della query per estrarre i termini di ricerca.Processing a full text search query starts with parsing the query text to extract search terms. Il motore di ricerca usa un indice per recuperare i documenti con termini corrispondenti.The search engine uses an index to retrieve documents with matching terms. I termini delle singole query vengono a volte suddivisi e ricostituiti in nuove forme per eseguire il cast di una rete più ampia su ciò che può essere considerato come corrispondenza potenziale.Individual query terms are sometimes broken down and reconstituted into new forms to cast a broader net over what could be considered as a potential match. Un set di risultati viene quindi ordinato sulla base di un punteggio di pertinenza assegnato a ogni singolo documento corrispondente.A result set is then sorted by a relevance score assigned to each individual matching document. Quelli nella parte superiore dell'elenco di pertinenza vengono restituiti all'applicazione chiamante.Those at the top of the ranked list are returned to the calling application.

L'esecuzione di query riproposte presenta quattro fasi:Restated, query execution has four stages:

  1. Analisi della queryQuery parsing
  2. Analisi lessicaleLexical analysis
  3. Recupero dei documentiDocument retrieval
  4. Assegnazione dei punteggiScoring

Il diagramma seguente illustra i componenti usati per elaborare una richiesta di ricerca.The diagram below illustrates the components used to process a search request.

Diagramma dell'architettura della query di Lucene in Ricerca di Azure

Componenti chiaveKey components Descrizione funzionaleFunctional description
Parser della queryQuery parsers Separare i termini della query dagli operatori della query e creare la struttura della query (un albero di query) da inviare al motore di ricerca.Separate query terms from query operators and create the query structure (a query tree) to be sent to the search engine.
AnalizzatoriAnalyzers Eseguire l'analisi lessicale sui termini della query.Perform lexical analysis on query terms. Questo processo può implicare la trasformazione, la rimozione o l'espansione dei termini della query.This process can involve transforming, removing, or expanding of query terms.
IndexIndex Una struttura efficiente dei dati usata per archiviare e organizzare i termini ricercabili estratti da documenti indicizzati.An efficient data structure used to store and organize searchable terms extracted from indexed documents.
Motore di ricercaSearch engine Recupera e assegna i punteggi di documenti corrispondenti in base al contenuto dell'indice invertito.Retrieves and scores matching documents based on the contents of the inverted index.

Anatomia di una richiesta di ricercaAnatomy of a search request

Una richiesta di ricerca è una specifica completa di ciò che deve essere restituito in un set di risultati.A search request is a complete specification of what should be returned in a result set. Nella forma più semplice, è una query vuota senza alcun tipo di criterio.In simplest form, it is an empty query with no criteria of any kind. Un esempio più realistico include parametri, termini di query diversi, forse con ambito in determinati campi, con eventualmente un'espressione filtro e regole di ordinamento.A more realistic example includes parameters, several query terms, perhaps scoped to certain fields, with possibly a filter expression and ordering rules.

L'esempio seguente è una richiesta di ricerca che è possibile inviare a Ricerca di Azure tramite l'API REST.The following example is a search request you might send to Azure Search using the REST API.

POST /indexes/hotels/docs/search?api-version=2016-09-01 
{  
    "search": "Spacious, air-condition* +\"Ocean view\"",  
    "searchFields": "description, title",  
    "searchMode": "any",
    "filter": "price ge 60 and price lt 300",  
    "orderby": "geo.distance(location, geography'POINT(-159.476235 22.227659)')", 
    "queryType": "full" 
 } 

Per questa richiesta, il motore di ricerca esegue le operazioni seguenti:For this request, the search engine does the following:

  1. Filtra i documenti in cui il prezzo è almeno $ 60 e meno di $ 300.Filters out documents where the price is at least $60 and less than $300.
  2. Esegue la query.Executes the query. In questo esempio la query di ricerca è costituita da frasi e termini: "Spacious, air-condition* +\"Ocean view\"" (gli utenti in genere non immettono segni di punteggiatura, ma includerli nell'esempio consente di spiegare come la gestiscono gli analizzatori).In this example, the search query consists of phrases and terms: "Spacious, air-condition* +\"Ocean view\"" (users typically don't enter punctuation, but including it in the example allows us to explain how analyzers handle it). Per questa query, il motore di ricerca esegue la scansione della descrizione e dei campi del titolo specificati in searchFields per i documenti che contengono "Vista sull'Oceano" e anche il termine "spazioso" o i termini che iniziano con il prefisso "aria condizionata".For this query, the search engine scans the description and title fields specified in searchFields for documents that contain "Ocean view", and additionally on the term "spacious", or on terms that start with the prefix "air-condition". Il parametro searchMode viene usato per l'abbinamento con qualsiasi termine (impostazione predefinita) o con tutti i termini, per i casi in cui un termine non è esplicitamente richiesto (+).The searchMode parameter is used to match on any term (default) or all of them, for cases where a term is not explicitly required (+).
  3. Ordina il set risultante degli hotel in prossimità di una posizione geografica specificata e quindi restituita all'applicazione chiamante.Orders the resulting set of hotels by proximity to a given geography location, and then returned to the calling application.

La maggior parte di questo articolo riguarda l'elaborazione di query di ricerca: "Spacious, air-condition* +\"Ocean view\"".The majority of this article is about processing of the search query: "Spacious, air-condition* +\"Ocean view\"". Il filtro e l'ordinamento non appartengono all'ambito.Filtering and ordering are out of scope. Per altre informazioni, vedere la Documentazione di riferimento dell'API di Ricerca.For more information, see the Search API reference documentation.

Fase 1: Analisi della queryStage 1: Query parsing

Come accennato, la stringa della query è la prima riga della richiesta:As noted, the query string is the first line of the request:

 "search": "Spacious, air-condition* +\"Ocean view\"", 

Il parser della query separa gli operatori (ad esempio * e + nell'esempio) dalla ricerca di termini e annulla la costruzione della query di ricerca in sottoquery di un tipo supportato:The query parser separates operators (such as * and + in the example) from search terms, and deconstructs the search query into subqueries of a supported type:

  • query del termine per i termini singoli (ad esempio spazioso)term query for standalone terms (like spacious)
  • query della frase per i termini tra virgolette (ad esempio vista oceano)phrase query for quoted terms (like ocean view)
  • query del prefisso per i termini seguiti da un operatore prefisso * (ad esempio, aria condizionata)prefix query for terms followed by a prefix operator * (like air-condition)

Per un elenco completo dei tipi di query supportati vedere Sintassi di query LuceneFor a full list of supported query types see Lucene query syntax

Gli operatori associati a una sottoquery determinano se la query "deve essere" o "dovrebbe essere" soddisfatta al fine di considerare un documento come corrispondenza.Operators associated with a subquery determine whether the query "must be" or "should be" satisfied in order for a document to be considered a match. Ad esempio, +"Ocean view" è "deve" in virtù dell'operatore +.For example, +"Ocean view" is "must" due to the + operator.

Il parser della query ristruttura le sottoquery in un albero della query (una struttura interna che rappresenta la query) e la trasmette al motore di ricerca.The query parser restructures the subqueries into a query tree (an internal structure representing the query) it passes on to the search engine. Nella prima fase di analisi della query, l'albero della query appare come segue.In the first stage of query parsing, the query tree looks like this.

Boolean query searchmode any

Parser supportati: Lucene semplice e completaSupported parsers: Simple and Full Lucene

La Ricerca di Azure espone due diversi linguaggi di query, simple (impostazione predefinita) e full.Azure Search exposes two different query languages, simple (default) and full. Impostando il parametro queryType con la richiesta di ricerca, si indica al parser della query quale linguaggio di query si sceglie in modo che sappia come interpretare gli operatori e la sintassi.By setting the queryType parameter with your search request, you tell the query parser which query language you choose so that it knows how to interpret the operators and syntax. Il linguaggio semplice della query è intuitivo e potente, spesso adatto a interpretare l'input dell'utente così come si presenta, senza elaborazione dal lato client.The Simple query language is intuitive and robust, often suitable to interpret user input as-is without client-side processing. Supporta operatori di query familiari dai motori di ricerca Web.It supports query operators familiar from web search engines. Il Linguaggio di query Lucene Full, che si ottiene impostando queryType=full, estende il linguaggio di query semplice di impostazione predefinita aggiungendo il supporto per più operatori e tipi di query quali carattere jolly, fuzzy, regex e query con ambito campo.The Full Lucene query language, which you get by setting queryType=full, extends the default Simple query language by adding support for more operators and query types like wildcard, fuzzy, regex, and field-scoped queries. Ad esempio, un'espressione regolare inviata nella sintassi di query semplice verrebbe interpretata come una stringa di query e non come un'espressione.For example, a regular expression sent in Simple query syntax would be interpreted as a query string and not an expression. La richiesta di esempio in questo articolo usa il linguaggio di query Lucene Full.The example request in this article uses the Full Lucene query language.

Impatto di searchMode sul parserImpact of searchMode on the parser

Un altro parametro di richiesta di ricerca che interessa l'analisi è il parametro searchMode.Another search request parameter that affects parsing is the searchMode parameter. Questo parametro controlla l'operatore predefinito per le query booleane: qualsiasi (predefinita) o tutte.It controls the default operator for Boolean queries: any (default) or all.

Quando searchMode=any, valore predefinito, il delimitatore tra spazioso e aria condizionata è OR (||), rendendo il testo di query di esempio equivalente a:When searchMode=any, which is the default, the space delimiter between spacious and air-condition is OR (||), making the sample query text equivalent to:

Spacious,||air-condition*+"Ocean view" 

Gli operatori espliciti, ad esempio + in +"Ocean view", non sono ambigui nella costruzione di query booleana (il termine deve corrispondere).Explicit operators, such as + in +"Ocean view", are unambiguous in boolean query construction (the term must match). Come interpretare i termini rimanenti è meno ovvio: spazioso e aria condizionata.Less obvious is how to interpret the remaining terms: spacious and air-condition. Il motore di ricerca dovrebbe trovare corrispondenze su vista sull'oceano and spazioso and aria condizionata?Should the search engine find matches on ocean view and spacious and air-condition? O dovrebbe trovare vista sull'oceano più uno dei termini rimanenti?Or should it find ocean view plus either one of the remaining terms?

Per impostazione predefinita (searchMode=any), il motore di ricerca assume l'interpretazione più ampia.By default (searchMode=any), the search engine assumes the broader interpretation. Uno dei campi dovrebbe essere associato, riflettendo la semantica di "or".Either field should be matched, reflecting "or" semantics. L'albero della query iniziale illustrato in precedenza, con due operazioni "should", mostra il valore predefinito.The initial query tree illustrated previously, with the two "should" operations, shows the default.

Si supponga che abbiamo ora impostato searchMode=all.Suppose that we now set searchMode=all. In questo caso, lo spazio viene interpretato come un'operazione "and".In this case, the space is interpreted as an "and" operation. Ciascuno dei termini rimanenti deve essere presente nel documento per essere considerato come corrispondenza.Each of the remaining terms must both be present in the document to qualify as a match. La query di esempio risultante verrebbe interpretata nel modo seguente:The resulting sample query would be interpreted as follows:

+Spacious,+air-condition*+"Ocean view"  

Un albero di query modificato per questa query sarà come segue, se un documento corrispondente è l'intersezione di tutte e tre le sottoquery:A modified query tree for this query would be as follows, where a matching document is the intersection of all three subqueries:

Boolean query searchmode all

Nota

La scelta searchMode=any rispetto a searchMode=all è una scelta migliore a cui si arriva eseguendo le query rappresentative.Choosing searchMode=any over searchMode=all is a decision best arrived at by running representative queries. Gli utenti che molto probabilmente includono operatori (comune quando si eseguono ricerche nell'archivio dei documenti) potrebbero trovare risultati più intuitivi se searchMode=all informa i costrutti della query booleana.Users who are likely to include operators (common when searching document stores) might find results more intuitive if searchMode=all informs boolean query constructs. Per altre informazioni sull'interazione tra searchMode e gli operatori, vedere Simple query syntax (Sintassi di query semplice).For more about the interplay between searchMode and operators, see Simple query syntax.

Fase 2: Analisi lessicaleStage 2: Lexical analysis

Gli analizzatori lessicali elaborano le query del termine e le query della frase dopo aver strutturato l'albero della query.Lexical analyzers process term queries and phrase queries after the query tree is structured. Un analizzatore accetta gli input di testo assegnati dal parser, elabora il testo e quindi invia nuovamente in formato token i termini da incorporare nell'albero della query.An analyzer accepts the text inputs given to it by the parser, processes the text, and then sends back tokenized terms to be incorporated into the query tree.

La forma più comune di analisi lessicale è l'analisi linguistica che trasforma i termini della query in base a regole specifiche per un determinato linguaggio:The most common form of lexical analysis is linguistic analysis which transforms query terms based on rules specific to a given language:

  • Riduzione di un termine della query nella forma radice di una parolaReducing a query term to the root form of a word
  • Rimozione di parole non essenziali (parole non significative, ad esempio "the" o "and" in inglese)Removing non-essential words (stopwords, such as "the" or "and" in English)
  • Suddivisione di una parola composta nelle parti che la compongonoBreaking a composite word into component parts
  • Trasformazione in lettere minuscole di una parola in lettere maiuscoleLower casing an upper case word

Tutte queste operazioni tendono a cancellare le differenze tra l'input del testo fornito dall'utente e i termini archiviati nell'indice.All of these operations tend to erase differences between the text input provided by the user and the terms stored in the index. Tali operazioni vanno oltre l'elaborazione del testo e richiedono una conoscenza approfondita del linguaggio.Such operations go beyond text processing and require in-depth knowledge of the language itself. Per aggiungere questo livello di consapevolezza linguistica, Ricerca di Azure supporta un lungo elenco di analizzatori della lingua di Microsoft e Lucene.To add this layer of linguistic awareness, Azure Search supports a long list of language analyzers from both Lucene and Microsoft.

Nota

I requisiti per l'analisi possono variare da minimi a elaborati a seconda dello scenario.Analysis requirements can range from minimal to elaborate depending on your scenario. È possibile controllare la complessità dell'analisi lessicale quando si seleziona uno degli analizzatori predefiniti o creando il proprio analizzatore personalizzato.You can control complexity of lexical analysis by the selecting one of the predefined analyzers or by creating your own custom analyzer. Gli analizzatori sono limitati a campi ricercabili e vengono specificati come parte di una definizione di campo.Analyzers are scoped to searchable fields and are specified as part of a field definition. Ciò consente di variare l'analisi lessicale in base al campo.This allows you to vary lexical analysis on a per-field basis. Se non è specificato, viene usato l'analizzatore Lucene standard.Unspecified, the standard Lucene analyzer is used.

Nel nostro esempio, prima dell'analisi, l'albero della query iniziale contiene il termine "Spazioso,", con una "S" maiuscola e una virgola, che il parser della query interpreta come parte del termine della query (la virgola non viene considerata come operatore di linguaggio della query).In our example, prior to analysis, the initial query tree has the term "Spacious," with an uppercase "S" and a comma that the query parser interprets as a part of the query term (a comma is not considered a query language operator).

Quando l'analizzatore predefinito elabora il termine, renderà con lettere minuscole "vista sull'oceano" e "spazioso" e rimuoverà il carattere di virgola.When the default analyzer processes the term, it will lowercase "ocean view" and "spacious", and remove the comma character. L'albero della query modificato avrà l'aspetto seguente:The modified query tree will look as follows:

Query booleana con termini analizzati

Comportamenti dell'analizzatore del testTesting analyzer behaviors

Il comportamento di un analizzatore può essere testato usando l'API Analyze.The behavior of an analyzer can be tested using the Analyze API. Fornire il testo da analizzare per vedere quali termini specificati saranno generati dall'analizzatore.Provide the text you want to analyze to see what terms given analyzer will generate. Ad esempio, per visualizzare il modo in cui l'analizzatore standard elabora il testo "aria condizionata", è possibile eseguire la richiesta seguente:For example, to see how the standard analyzer would process the text "air-condition", you can issue the following request:

{ 
    "text": "air-condition",
    "analyzer": "standard"
}

L'analizzatore standard suddivide il testo di input nei due token seguenti, annotandoli con attributi quali offset iniziale e finale (usati per l'evidenziazione dei risultati), nonché con la loro posizione (usata per la corrispondenza di una frase):The standard analyzer breaks the input text into the following two tokens, annotating them with attributes like start and end offsets (used for hit highlighting) as well as their position (used for phrase matching):

{  
  "tokens": [
    {
      "token": "air",
      "startOffset": 0,
      "endOffset": 3,
      "position": 0
    },
    {
      "token": "condition",
      "startOffset": 4,
      "endOffset": 13,
      "position": 1
    }
  ]
}

Eccezioni all'analisi lessicaleExceptions to lexical analysis

L'analisi lessicale si applica solo ai tipi di query che richiedono termini completi, una query di termine o una query di frase.Lexical analysis applies only to query types that require complete terms – either a term query or a phrase query. Non si applica ai tipi di query con termini incompleti: query di prefisso, query con caratteri jolly, query regex o query fuzzy.It doesn’t apply to query types with incomplete terms – prefix query, wildcard query, regex query – or to a fuzzy query. Questi tipi di query, tra cui la query di prefisso con il termine *aria condizionata** nel nostro esempio, vengono aggiunti direttamente all'albero della query, ignorando la fase di analisi.Those query types, including the prefix query with term *air-condition** in our example, are added directly to the query tree, bypassing the analysis stage. L'unica trasformazione eseguita per i termini della query di queste tipologie è la conversione in lettere minuscole.The only transformation performed on query terms of those types is lowercasing.

Fase 3: Recupero dei documentiStage 3: Document retrieval

Il recupero dei documenti fa riferimento alla ricerca di documenti con termini corrispondenti all'indice.Document retrieval refers to finding documents with matching terms in the index. Questa fase viene spiegata meglio attraverso un esempio.This stage is understood best through an example. Iniziamo con un indice degli hotel che presenta il seguente schema semplice:Let's start with a hotels index having the following simple schema:

{   
    "name": "hotels",     
    "fields": [     
        { "name": "id", "type": "Edm.String", "key": true, "searchable": false },     
        { "name": "title", "type": "Edm.String", "searchable": true },     
        { "name": "description", "type": "Edm.String", "searchable": true }
    ] 
} 

Si supponga anche che l'indice contenga i seguenti quattro documenti:Further assume that this index contains the following four documents:

{ 
    "value": [
        {         
            "id": "1",         
            "title": "Hotel Atman",         
            "description": "Spacious rooms, ocean view, walking distance to the beach."   
        },       
        {         
            "id": "2",         
            "title": "Beach Resort",        
            "description": "Located on the north shore of the island of Kauaʻi. Ocean view."     
        },       
        {         
            "id": "3",         
            "title": "Playa Hotel",         
            "description": "Comfortable, air-conditioned rooms with ocean view."
        },       
        {         
            "id": "4",         
            "title": "Ocean Retreat",         
            "description": "Quiet and secluded"
        }    
    ]
}

Come vengono indicizzati terminiHow terms are indexed

Comprendere il recupero è utile per conoscere alcune nozioni di base sull'indicizzazione.To understand retrieval, it helps to know a few basics about indexing. L'unità di archiviazione è un indice invertito, uno per ogni campo ricercabile.The unit of storage is an inverted index, one for each searchable field. In un indice invertito è presente un elenco ordinato di tutti i termini derivanti da tutti i documenti.Within an inverted index is a sorted list of all terms from all documents. Ogni termine esegue il mapping nell'elenco di termini in cui si verifica, come si evince nell'esempio seguente.Each term maps to the list of documents in which it occurs, as evident in the example below.

Per produrre i termini in un indice inverso, il motore di ricerca esegue l'analisi lessicale del contenuto dei documenti, analogamente a quanto accade durante l'elaborazione delle query:To produce the terms in an inverted index, the search engine performs lexical analysis over the content of documents, similar to what happens during query processing:

  1. Gli input di testo vengono passati a un analizzatore, in lettere minuscole, prive di punteggiatura e così via, a seconda della configurazione dell'analizzatore.Text inputs are passed to an analyzer, lower-cased, stripped of punctuation, and so forth, depending on the analyzer configuration.
  2. I token costituiscono l'output dell'analisi del testo.Tokens are the output of text analysis.
  3. I termini vengono aggiunti all'indice.Terms are added to the index.

È comune, ma non obbligatorio, usare gli stessi analizzatori per la ricerca e le operazioni di indicizzazione in modo che i termini di query assomiglino di più ai termini contenuti nell'indice.It's common, but not required, to use the same analyzers for search and indexing operations so that query terms look more like terms inside the index.

Nota

Ricerca di Azure consente di specificare diversi analizzatori per l'indicizzazione e la ricerca tramite parametri di campo aggiuntivi indexAnalyzer e searchAnalyzer.Azure Search lets you specify different analyzers for indexing and search via additional indexAnalyzer and searchAnalyzer field parameters. Se non è specificato, l'analizzatore impostato con la proprietà analyzer viene usato per l'indicizzazione e la ricerca.If unspecified, the analyzer set with the analyzer property is used for both indexing and searching.

Indice invertito per i documenti di esempioInverted index for example documents

Ritornando all'esempio precedente, per il campo titolo, l'indice invertito è simile al seguente:Returning to our example, for the title field, the inverted index looks like this:

TermineTerm Elenco di documentiDocument list
atmanatman 11
spiaggiabeach 22
hotelhotel 1, 31, 3
oceanoocean 44
playaplaya 33
resortresort 33
rifugioretreat 44

Nel campo del titolo, solo hotel viene visualizzato in due documenti: 1, 3.In the title field, only hotel shows up in two documents: 1, 3.

Per il campo descrizione, l'indice è il seguente:For the description field, the index is as follows:

TermineTerm Elenco di documentiDocument list
ariaair 33
eand 44
spiaggiabeach 11
condizionataconditioned 33
comodocomfortable 33
distancedistance 11
isolaisland 22
kauaʻikauaʻi 22
posizionatolocated 22
nordnorth 22
oceanoocean 1, 2, 31, 2, 3
diof 22
inon 22
tranquilloquiet 44
camererooms 1, 31, 3
appartatosecluded 44
costashore 22
spaziosospacious 11
ilthe 1, 21, 2
toto 11
viewview 1, 2, 31, 2, 3
passeggiatawalking 11
conwith 33

Corrispondenza dei termini di query con i termini indicizzatiMatching query terms against indexed terms

Dati gli indici invertiti precedenti, tornare alla query di esempio e vedere come si trovano i documenti corrispondenti per la query di esempio.Given the inverted indices above, let’s return to the sample query and see how matching documents are found for our example query. Tenere presente che l'albero della query finale ha il seguente aspetto:Recall that the final query tree looks like this:

Query booleana con termini analizzati

Durante l'esecuzione delle query, le singole query vengono eseguite sulla base dei campi ricercabili in modo indipendente.During query execution, individual queries are executed against the searchable fields independently.

  • Il TermQuery "spazioso" corrisponde al documento 1 (Hotel Atman).The TermQuery, "spacious", matches document 1 (Hotel Atman).

  • Il PrefixQuery "aria-condizionata" non corrisponde a nessun documento.The PrefixQuery, "air-condition", doesn't match any documents.

    Si tratta di un comportamento che a volte confonde gli sviluppatori.This is a behavior that sometimes confuses developers. Sebbene il termine aria condizionata esista nel documento, è suddiviso in due termini dall'analizzatore predefinito.Although the term air-conditioned exists in the document, it is split into two terms by the default analyzer. È importante ricordare che le query di prefisso, che contengono termini parziali, non vengono analizzate.Recall that prefix queries, which contain partial terms, are not analyzed. Di conseguenza termini con prefisso "aria condizionata" vengono cercati nell'indice invertito e non trovati.Therefore terms with prefix "air-condition" are looked up in the inverted index and not found.

  • La PhraseQuery "vista sull'oceano" cerca i termini "oceano" e "vista" e controlla la prossimità dei termini nel documento originale.The PhraseQuery, "ocean view", looks up the terms "ocean" and "view" and checks the proximity of terms in the original document. I documenti 1, 2 e 3 abbinano questa query nel campo della descrizione.Documents 1, 2 and 3 match this query in the description field. Si noti che il documento 4 contiene il termine oceano, ma non è considerata una corrispondenza poiché stiamo cercando la frase "vista sull'oceano" e non le singole parole.Notice document 4 has the term ocean in the title but isn’t considered a match, as we're looking for the "ocean view" phrase rather than individual words.

Nota

Viene eseguita una query di ricerca in modo indipendente in tutti i campi disponibili per la ricerca nell'indice di Ricerca di Azure a meno che non si superino i campi impostati con il parametro searchFields, come illustrato nella richiesta di ricerca di esempio.A search query is executed independently against all searchable fields in the Azure Search index unless you limit the fields set with the searchFields parameter, as illustrated in the example search request. Vengono restituiti i documenti corrispondenti in uno dei campi selezionati.Documents that match in any of the selected fields are returned.

Nel complesso, per la query in questione, i documenti corrispondenti sono 1, 2, 3.On the whole, for the query in question, the documents that match are 1, 2, 3.

Fase 4: Assegnazione dei punteggiStage 4: Scoring

Ad ogni documento in un set di risultati di ricerca viene assegnato un punteggio di pertinenza.Every document in a search result set is assigned a relevance score. La funzione del punteggio di pertinenza è di posizionare in alto in classifica quei documenti che meglio rispondono a una domanda utente espressa dalla query di ricerca.The function of the relevance score is to rank higher those documents that best answer a user question as expressed by the search query. Il punteggio viene calcolato in base alle proprietà statistiche dei termini che corrispondono.The score is computed based on statistical properties of terms that matched. Alla base della formula del punteggio è presente la ponderazione TF/IDF (frequenza del termine - frequenza inversa del documento).At the core of the scoring formula is TF/IDF (term frequency-inverse document frequency). Nelle query che contengono termini rari e comuni, il TF/IDF promuove i risultati contenenti il termine raro.In queries containing rare and common terms, TF/IDF promotes results containing the rare term. Ad esempio, in un indice ipotetico con tutti gli articoli di Wikipedia, dai documenti che corrispondono alla query il presidente, i documenti che corrispondono a presidente sono considerati più pertinenti dei documenti corrispondenti con il.For example, in a hypothetical index with all Wikipedia articles, from documents that matched the query the president, documents matching on president are considered more relevant than documents matching on the.

Esempio di assegnazione dei punteggiScoring example

Richiamare i tre documenti che corrispondono alla query di esempio:Recall the three documents that matched our example query:

search=Spacious, air-condition* +"Ocean view"  
{  
  "value": [
    {
      "@search.score": 0.25610128,
      "id": "1",
      "title": "Hotel Atman",
      "description": "Spacious rooms, ocean view, walking distance to the beach."
    },
    {
      "@search.score": 0.08951007,
      "id": "3",
      "title": "Playa Hotel",
      "description": "Comfortable, air-conditioned rooms with ocean view."
    },
    {
      "@search.score": 0.05967338,
      "id": "2",
      "title": "Ocean Resort",
      "description": "Located on a cliff on the north shore of the island of Kauai. Ocean view."
    }
  ]
}

Il documento 1 corrisponde alla query migliore poiché sia il termine spazioso sia la frase richiesta vista sull'oceano si verificano nel campo descrizione.Document 1 matched the query best because both the term spacious and the required phrase ocean view occur in the description field. I due documenti successivi corrispondono solo per la frase vista sull'oceano.The next two documents match only the phrase ocean view. È sorprendente constatare che il punteggio di pertinenza per i documenti 2 e 3 è diverso, anche se essi corrispondono alla query nello stesso modo.It might be surprising that the relevance score for document 2 and 3 is different even though they matched the query in the same way. Ciò avviene perché la formula di assegnazione del punteggio include più componenti rispetto a TF/IDF.It's because the scoring formula has more components than just TF/IDF. In questo caso al documento 3 è stato assegnato un punteggio leggermente maggiore perché la sua descrizione è più breve.In this case, document 3 was assigned a slightly higher score because its description is shorter. Informazioni sulla formula Lucene per il punteggio pratico per comprendere in che modo la lunghezza del campo e altri fattori possono influenzare il punteggio di pertinenza.Learn about Lucene's Practical Scoring Formula to understand how field length and other factors can influence the relevance score.

Alcuni tipi di query (carattere jolly, prefisso, regex) contribuiscono sempre con un punteggio costante al punteggio complessivo del documento.Some query types (wildcard, prefix, regex) always contribute a constant score to the overall document score. Questo permette alle corrispondenze trovate tramite l'espansione della query di essere incluse nei risultati, ma senza modificare la classifica.This allows matches found through query expansion to be included in the results, but without affecting the ranking.

Un esempio illustra il motivo per cui questo risulta importante.An example illustrates why this matters. Le ricerche con caratteri jolly, tra cui le ricerche con prefisso, sono ambigue per definizione poiché l'input è una stringa parziale con potenziali corrispondenze in un numero molto elevato di termini diversi (si consideri un input di "tour", con corrispondenze trovate in "tour", "tourettes" e "tourmaline").Wildcard searches, including prefix searches, are ambiguous by definition because the input is a partial string with potential matches on a very large number of disparate terms (consider an input of "tour", with matches found on “tours”, “tourettes”, and “tourmaline”). Data la natura di questi risultati, non è possibile dedurre ragionevolmente quali termini risultino più utili rispetto ad altri.Given the nature of these results, there is no way to reasonably infer which terms are more valuable than others. Per questo motivo, verranno ignorate le frequenze di termini durante l'assegnazione dei punteggi dei risultati nelle query di tipo con caratteri jolly, prefisso e regex.For this reason, we ignore term frequencies when scoring results in queries of types wildcard, prefix and regex. In una richiesta di ricerca a più parti che comprende termini parziali e completi, i risultati dall'input parziale sono incorporati con un punteggio costante per evitare la distorsione verso risultati potenzialmente imprevisti.In a multi-part search request that includes partial and complete terms, results from the partial input are incorporated with a constant score to avoid bias towards potentially unexpected matches.

Ottimizzazione del punteggioScore tuning

Esistono due modi per ottimizzare i punteggi di pertinenza in Ricerca di Azure:There are two ways to tune relevance scores in Azure Search:

  1. I profili di punteggio promuovono i documenti nell'elenco di pertinenza dei risultati in base a un set di regole.Scoring profiles promote documents in the ranked list of results based on a set of rules. Nel nostro esempio è possibile considerare i documenti che corrispondono al campo del titolo più rilevanti rispetto ai documenti corrispondenti al campo della descrizione.In our example, we could consider documents that matched in the title field more relevant than documents that matched in the description field. In aggiunta, se l'indice dispone di un campo prezzo per ogni albergo, è possibile promuovere i documenti con prezzo inferiore.Additionally, if our index had a price field for each hotel, we could promote documents with lower price. Informazioni su come aggiungere profili di punteggio a un indice di ricerca.Learn more how to add Scoring Profiles to a search index.
  2. Aumento priorità dei termini (disponibile solo nella sintassi di query Lucene Full) offre un aumento della priorità dell'operatore ^ che può essere applicato a qualsiasi parte dell'albero della query.Term boosting (available only in the Full Lucene query syntax) provides a boosting operator ^ that can be applied to any part of the query tree. Nel nostro esempio invece di cercare il prefisso aria condizionata*, è possibile cercare il termine esatto aria condizionata o il prefisso, ma i documenti che corrispondono al termine esatto si trovano in una posizione più alta applicando l'aumento della priorità alla query del termine: aria condizionata^2||aria condizionata.In our example, instead of searching on the prefix *air-condition*, one could search for either the exact term air-condition or the prefix, but documents that match on the exact term are ranked higher by applying boost to the term query: air-condition^2||air-condition*. Altre informazioni sull'aumento della priorità dei termini.Learn more about term boosting.

Assegnazione dei punteggi in un indice distribuitoScoring in a distributed index

Tutti gli indici in Ricerca di Azure sono automaticamente suddivisi in più partizioni, consentendo di distribuire rapidamente l'indice tra più nodi durante la scalabilità verticale o orizzontale del servizio.All indexes in Azure Search are automatically split into multiple shards, allowing us to quickly distribute the index among multiple nodes during service scale up or scale down. Quando viene eseguita una richiesta di ricerca, viene generata in ogni partizione in modo indipendente.When a search request is issued, it’s issued against each shard independently. I risultati di ogni partizione vengono uniti e ordinati in base al punteggio (se non è definito nessun altro ordine).The results from each shard are then merged and ordered by score (if no other ordering is defined). È importante sapere che la funzione di assegnazione dei punteggi pesa la frequenza del termine della query rispetto alla frequenza inversa del documento in tutti i documenti all'interno della partizione, non in tutte le partizioni.It is important to know that the scoring function weights query term frequency against its inverse document frequency in all documents within the shard, not across all shards!

Ciò significa che un punteggio di pertinenza potrebbe essere diverso per documenti identici se si trovano in partizioni diverse.This means a relevance score could be different for identical documents if they reside on different shards. Fortunatamente, queste differenze tendono a scomparire man mano che aumenta il numero di documenti nell'indice a causa anche di altre distribuzioni del termine.Fortunately, such differences tend to disappear as the number of documents in the index grows due to more even term distribution. Non è possibile presumere in quale partizione verrà inserito un documento specifico.It’s not possible to assume on which shard any given document will be placed. Tuttavia, dando per assunto che una chiave del documento non cambia, verrà sempre assegnata alla stessa partizione.However, assuming a document key doesn't change, it will always be assigned to the same shard.

In genere, il punteggio del documento non è l'attributo migliore per l'ordinamento dei documenti se la stabilità dell'ordine è importante.In general, document score is not the best attribute for ordering documents if order stability is important. Ad esempio, dati due documenti con un punteggio identico, non vi sono garanzie circa quale sarà visualizzato per primo in esecuzioni successive della stessa query.For example, given two documents with an identical score, there is no guarantee which one appears first in subsequent runs of the same query. Il punteggio del documento deve solo dare un'idea generale della pertinenza del documento relativo ad altri documenti nel set di risultati.Document score should only give a general sense of document relevance relative to other documents in the results set.

ConclusioneConclusion

Il successo dei motori di ricerca Internet ha generato aspettative per la ricerca full-text su dati privati.The success of internet search engines has raised expectations for full text search over private data. Per quasi tutti i tipi di esperienza di ricerca, è ora previsto che il motore comprenda il nostro obiettivo, anche quando i termini sono errati o incompleti.For almost any kind of search experience, we now expect the engine to understand our intent, even when terms are misspelled or incomplete. Si possono anche prevedere delle corrispondenze basate su termini quasi equivalenti o sinonimi che non abbiamo mai specificato.We might even expect matches based on near equivalent terms or synonyms that we never actually specified.

Dal punto di vista tecnico, la ricerca full-text è estremamente complessa, richiede un'analisi linguistica sofisticata e un approccio sistematico all'elaborazione in modo tale da filtrare, espandere e trasformare i termini della query per fornire un risultato pertinente.From a technical standpoint, full text search is highly complex, requiring sophisticated linguistic analysis and a systematic approach to processing in ways that distill, expand, and transform query terms to deliver a relevant result. Date le complessità intrinseche, esistono molti fattori che possono influire sul risultato di una query.Given the inherent complexities, there are a lot of factors that can affect the outcome of a query. Per questo motivo, investire del tempo per comprendere i meccanismi della ricerca full-text offre dei vantaggi tangibili quando si prova a lavorare con risultati imprevisti.For this reason, investing the time to understand the mechanics of full text search offers tangible benefits when trying to work through unexpected results.

In questo articolo è stata illustrata la ricerca full-text nel contesto di Ricerca di Azure.This article explored full text search in the context of Azure Search. Ci auguriamo che questo argomento offra un background sufficiente per riconoscere possibili cause e soluzioni per affrontare i problemi comuni della query.We hope it gives you sufficient background to recognize potential causes and resolutions for addressing common query problems.

Passaggi successiviNext steps

Vedere ancheSee also

Search Documents REST API (API REST di Ricerca di documenti)Search Documents REST API

Sintassi di query sempliceSimple query syntax

Full Lucene query syntax (Sintassi di query completa Lucene)Full Lucene query syntax

Gestire i risultati della ricercaHandle search results