Pesquisa de texto completo no Azure Pesquisa CognitivaFull text search in Azure Cognitive Search

Este artigo é para os desenvolvedores que precisam de uma compreensão mais profunda de como a pesquisa de texto completo do Lucene funciona no Azure Pesquisa Cognitiva.This article is for developers who need a deeper understanding of how Lucene full text search works in Azure Cognitive Search. Para consultas de texto, o Azure Cognitive Search produzirá facilmente os resultados esperados na maioria dos cenários, mas, ocasionalmente, você poderá obter um resultado que pode parecer "estranho".For text queries, Azure Cognitive Search will seamlessly deliver expected results in most scenarios, but occasionally you might get a result that seems "off" somehow. Nessas situações, ter experiência nos quatro estágios da execução da consulta do Lucene (análise léxica, análise da consulta, correspondência de documentos e pontuação) pode ajudá-lo a identificar alterações específicas nos parâmetros de consulta ou na configuração de índice que proporcionarão o resultado desejado.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.

Observação

O Azure Pesquisa Cognitiva usa o Lucene para pesquisa de texto completo, mas a integração do Lucene não é exaustiva.Azure Cognitive Search uses Lucene for full text search, but Lucene integration is not exhaustive. Vamos expor seletivamente e estender a funcionalidade Lucene para habilitar os cenários importantes para o Azure Pesquisa Cognitiva.We selectively expose and extend Lucene functionality to enable the scenarios important to Azure Cognitive Search.

Diagrama e visão geral da arquiteturaArchitecture overview and diagram

O processamento de uma consulta de pesquisa de texto completo começa com a análise do texto da consulta para extrair os termos de pesquisa.Processing a full text search query starts with parsing the query text to extract search terms. O mecanismo de pesquisa usa um índice para recuperar documentos com os termos correspondentes.The search engine uses an index to retrieve documents with matching terms. Os termos de consulta individual, às vezes, são divididos e reconstituídos em novos formulários para obter uma rede mais ampla sobre o que poderia ser considerado como uma possível correspondência.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. Um conjunto de resultados é classificado por uma pontuação de relevância atribuída a cada documento correspondente individual.A result set is then sorted by a relevance score assigned to each individual matching document. Aqueles no topo da lista com a classificação são retornados para o aplicativo de chamada.Those at the top of the ranked list are returned to the calling application.

A execução de consulta redefinida, tem quatro fases:Restated, query execution has four stages:

  1. Análise da consultaQuery parsing
  2. Análise léxicaLexical analysis
  3. Recuperação de documentosDocument retrieval
  4. PontuaçãoScoring

O diagrama a seguir ilustra os componentes usados para processar uma solicitação de pesquisa.The diagram below illustrates the components used to process a search request.

Diagrama de arquitetura de consulta Lucene no Azure Pesquisa Cognitiva

Principais componentesKey components Descrição funcionalFunctional description
Analisadores de consultaQuery parsers Separam os termos de consulta de operadores de consulta e criam a estrutura da consulta (uma árvore de consulta) a ser enviada para o mecanismo de pesquisa.Separate query terms from query operators and create the query structure (a query tree) to be sent to the search engine.
AnalisadoresAnalyzers Executam a análise léxica dos termos de consulta.Perform lexical analysis on query terms. Esse processo pode envolver a transformação, remoção ou expansão dos termos de consulta.This process can involve transforming, removing, or expanding of query terms.
IndexIndex Uma estrutura de dados eficiente usada para armazenar e organizar termos pesquisáveis extraídos de documentos indexados.An efficient data structure used to store and organize searchable terms extracted from indexed documents.
Mecanismo de pesquisaSearch engine Recupera e atribui uma pontuação aos documentos correspondentes com base no conteúdo do índice invertido.Retrieves and scores matching documents based on the contents of the inverted index.

Anatomia de uma solicitação de pesquisaAnatomy of a search request

Uma solicitação de pesquisa é uma especificação completa do que deve ser retornado em um conjunto de resultados.A search request is a complete specification of what should be returned in a result set. Na forma mais simples, é uma consulta vazia sem critérios de nenhum tipo.In simplest form, it is an empty query with no criteria of any kind. Um exemplo mais realista inclui parâmetros, vários termos de consulta, talvez com escopo para determinados campos, com possivelmente uma expressão de filtro e as regras de ordenação.A more realistic example includes parameters, several query terms, perhaps scoped to certain fields, with possibly a filter expression and ordering rules.

O exemplo a seguir é uma solicitação de pesquisa que você pode enviar para o Azure Pesquisa Cognitiva usando a API REST.The following example is a search request you might send to Azure Cognitive Search using the REST API.

POST /indexes/hotels/docs/search?api-version=2020-06-30
{
    "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" 
}

Para essa solicitação, o mecanismo de pesquisa faz o seguinte:For this request, the search engine does the following:

  1. Filtra os documentos em que o preço é pelo menos US $60 e menor que US $300.Filters out documents where the price is at least $60 and less than $300.
  2. Executa a consulta.Executes the query. Neste exemplo, a consulta de pesquisa consiste de frases e termos: "Spacious, air-condition* +\"Ocean view\"" (os usuários normalmente não inserem pontuação, mas incluí-la no exemplo permite explicar como os analisadores tratam a pontuação).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). Para essa consulta, o mecanismo de pesquisa examina a descrição e os campos de título especificados em searchFields para documentos que contenham "Vista para o mar", além do termo "espaçoso" ou em termos que começam com o prefixo "ar-condicio".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". O parâmetro searchMode é usado para corresponder a qualquer termo (padrão) ou todos eles, para casos em que um termo não for explicitamente solicitado (+).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. Ordena o conjunto resultante de hotéis por proximidade de uma localização geográfica indicada e retorna para o aplicativo de chamada.Orders the resulting set of hotels by proximity to a given geography location, and then returned to the calling application.

A maior parte deste artigo é sobre o processamento da consulta de pesquisa: "Spacious, air-condition* +\"Ocean view\"" .The majority of this article is about processing of the search query: "Spacious, air-condition* +\"Ocean view\"". Filtragem e ordenação estão fora do escopo.Filtering and ordering are out of scope. Para obter mais informações, consulte as documentação de referência da API de pesquisa.For more information, see the Search API reference documentation.

Estágio 1: Análise da consultaStage 1: Query parsing

Conforme observado, a cadeia de caracteres de consulta é a primeira linha da solicitação:As noted, the query string is the first line of the request:

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

O analisador de consulta separa os operadores (como * e + no exemplo) dos termos de pesquisa e desconstrói a consulta de pesquisa em subconsultas de um tipo com suporte: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:

  • consulta de termo para termos independentes (espaçoso, por exemplo)term query for standalone terms (like spacious)
  • consulta de frase para termos entre aspas (vista para o mar, por exemplo)phrase query for quoted terms (like ocean view)
  • consulta de prefixo por termos seguidos por um operador de prefixo * (ar-condicio, por exemplo)prefix query for terms followed by a prefix operator * (like air-condition)

Para obter uma lista completa dos tipos de consulta com suporte, veja sintaxe da consulta do LuceneFor a full list of supported query types see Lucene query syntax

Os operadores associados com uma subconsulta determinam se a consulta deve ser obrigatoriamente satisfeita ou não para um documento ser considerado uma correspondência.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. Por exemplo, +"Ocean view" é "obrigatória" devido ao operador +.For example, +"Ocean view" is "must" due to the + operator.

O analisador de consulta reestrutura as subconsultas em uma árvore de consulta (uma estrutura interna que representa a consulta) passada para o mecanismo de pesquisa.The query parser restructures the subqueries into a query tree (an internal structure representing the query) it passes on to the search engine. No primeiro estágio da análise de consulta, a árvore de consulta se parece com isto.In the first stage of query parsing, the query tree looks like this.

Booliano consulta modo de pesquisa qualquer

Analisadores com suporte: simples e Lucena completaSupported parsers: Simple and Full Lucene

O Azure Pesquisa Cognitiva expõe duas linguagens de consulta diferentes, simple (padrão) e full .Azure Cognitive Search exposes two different query languages, simple (default) and full. Ao definir o parâmetro queryType com sua solicitação de pesquisa, você informa ao analisador de consulta a linguagem de consulta que você escolheu para que ele saiba como interpretar os operadores e a sintaxe.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. A linguagem de consulta simples é intuitiva e robusta, geralmente adequada para interpretar a entrada do usuário conforme inserida, sem processamento no lado do cliente.The Simple query language is intuitive and robust, often suitable to interpret user input as-is without client-side processing. Ela oferece suporte a operadores de consulta familiares de mecanismos de pesquisa.It supports query operators familiar from web search engines. A linguagem de consulta Lucene completa, que você obtém definindo queryType=full, estende a linguagem de consulta simples padrão, adicionando suporte para mais operadores e tipos de consulta como caractere curinga, difusa, regex e consultas com escopo de 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. Por exemplo, uma expressão regular enviada na sintaxe de consulta simples será interpretada como uma cadeia de caracteres de consulta e não é uma expressão.For example, a regular expression sent in Simple query syntax would be interpreted as a query string and not an expression. A solicitação de exemplo neste artigo usa a linguagem de consulta Lucene completa.The example request in this article uses the Full Lucene query language.

Impacto do modo de pesquisa no analisadorImpact of searchMode on the parser

Outro parâmetro de solicitação de pesquisa que afeta a análise é o parâmetro searchMode.Another search request parameter that affects parsing is the searchMode parameter. Ele controla o operador padrão para consultas boolianas: qualquer (padrão) ou todos.It controls the default operator for Boolean queries: any (default) or all.

Quando searchMode=any, que é o padrão, o delimitador de espaço entre espaçoso e ar-condicio é OR (||), tornando o texto da consulta de exemplo 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" 

Operadores explícitos, como + em +"Ocean view", não são ambíguos na construção de consulta booliana (o termo deve corresponder).Explicit operators, such as + in +"Ocean view", are unambiguous in boolean query construction (the term must match). Menos óbvio é como interpretar os demais termos: espaçoso e ar-condicio.Less obvious is how to interpret the remaining terms: spacious and air-condition. O mecanismo de pesquisa deve localizar correspondências para vista para o mar e espaçoso e ar-condicio?Should the search engine find matches on ocean view and spacious and air-condition? Ou deve encontrar vista para o mar mais qualquer um dos demais termos?Or should it find ocean view plus either one of the remaining terms?

Por padrão (searchMode=any), o mecanismo de pesquisa assume a interpretação mais ampla.By default (searchMode=any), the search engine assumes the broader interpretation. Cada campo deve ter uma correspondência, refletindo a semântica de "ou".Either field should be matched, reflecting "or" semantics. A árvore de consulta inicial ilustrada anteriormente, com as duas operações de “não obrigatório”, mostra o padrão.The initial query tree illustrated previously, with the two "should" operations, shows the default.

Suponha que agora definimos searchMode=all.Suppose that we now set searchMode=all. Nesse caso, o espaço é interpretado como uma operação "e".In this case, the space is interpreted as an "and" operation. Cada um dos demais termos deve estar presente no documento para ser qualificado como uma correspondência.Each of the remaining terms must both be present in the document to qualify as a match. O exemplo de consulta resultante será interpretado da seguinte maneira:The resulting sample query would be interpreted as follows:

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

Uma árvore de consulta modificada para esta consulta seria a seguinte, onde um documento correspondente é a interseção de todas as três subconsultas:A modified query tree for this query would be as follows, where a matching document is the intersection of all three subqueries:

Booliano consulta modo de pesquisa todos

Observação

Escolher searchMode=any em vez de searchMode=all é uma decisão melhor ao executar consultas representativas.Choosing searchMode=any over searchMode=all is a decision best arrived at by running representative queries. Os usuários mais propensos a incluir operadores (comum ao pesquisar repositórios de documentos) pode encontrar resultados mais intuitivos se searchMode=all informa construções de consulta boolianas.Users who are likely to include operators (common when searching document stores) might find results more intuitive if searchMode=all informs boolean query constructs. Para obter mais informações sobre a interação entre searchMode e os operadores, consulte sintaxe de consulta simples.For more about the interplay between searchMode and operators, see Simple query syntax.

Estágio 2: Análise léxicaStage 2: Lexical analysis

Os analisadores léxicos processam consultas de termo e consultas de frase depois que a árvore de consulta é estruturada.Lexical analyzers process term queries and phrase queries after the query tree is structured. Um analisador aceita as entradas de texto fornecidas pelo analisador, processa o texto e, em seguida, envia de volta os termos com token a serem incorporados na árvore de consulta.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.

A forma mais comum de análise léxica é a análise linguística que transforma consultas baseadas em termos em regras específicas para um idioma específico:The most common form of lexical analysis is linguistic analysis which transforms query terms based on rules specific to a given language:

  • Reduzindo um termo de consulta para a raiz de uma palavraReducing a query term to the root form of a word
  • Removendo palavras não-essenciais (palavras irrelevantes, como "o/a" ou "e" em português)Removing non-essential words (stopwords, such as "the" or "and" in English)
  • Dividir uma palavra composta em componentesBreaking a composite word into component parts
  • Colocando letras minúsculas em uma palavra de letras maiúsculasLower casing an upper case word

Todas essas operações tendem a apagar as diferenças entre a entrada de texto fornecida pelo usuário e os termos armazenados no índice.All of these operations tend to erase differences between the text input provided by the user and the terms stored in the index. Essas operações vão além do processamento de texto e exigem um conhecimento profundo do próprio idioma.Such operations go beyond text processing and require in-depth knowledge of the language itself. Para adicionar essa camada de conscientização lingüística, o Azure Pesquisa Cognitiva dá suporte a uma longa lista de analisadores de linguagem tanto do Lucene quanto da Microsoft.To add this layer of linguistic awareness, Azure Cognitive Search supports a long list of language analyzers from both Lucene and Microsoft.

Observação

Os requisitos de análise podem variar de básicos a elaborados dependendo do seu cenário.Analysis requirements can range from minimal to elaborate depending on your scenario. Você pode controlar a complexidade da análise léxica selecionando um dos analisadores predefinidos ou criando seu próprio analisador personalizado.You can control complexity of lexical analysis by the selecting one of the predefined analyzers or by creating your own custom analyzer. O escopo dos analisadores inclui campos pesquisáveis e são especificados como parte de uma definição do campo.Analyzers are scoped to searchable fields and are specified as part of a field definition. Isso permite que você varie a análise léxica baseada no campo.This allows you to vary lexical analysis on a per-field basis. Se não for especificado, o analisador padrão para Lucene é usado.Unspecified, the standard Lucene analyzer is used.

Em nosso exemplo, antes da análise, a árvore de consulta inicial tem o termo "Espaçoso," com um "E" maiúsculo e uma vírgula que o analisador de consulta interpreta como parte do termo de consulta (uma vírgula não é considerada um operador de linguagem de consulta).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 o analisador padrão processa o termo, ele colocará "vista para o mar" e "espaçoso" em letras minúsculas e removerá o caractere de vírgula.When the default analyzer processes the term, it will lowercase "ocean view" and "spacious", and remove the comma character. A árvore de consulta modificada ficará da seguinte forma:The modified query tree will look as follows:

Consulta booliana com termos analisados

Testando os comportamentos do analisadorTesting analyzer behaviors

O comportamento de um analisador pode ser testado usando a API de análise.The behavior of an analyzer can be tested using the Analyze API. Forneça o texto que você deseja analisar para ver quais termos o analisador irá gerar.Provide the text you want to analyze to see what terms given analyzer will generate. Por exemplo, para ver como o analisador padrão processaria o texto "ar-condicio", você pode emitir a solicitação a seguir: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"
}

O analisador padrão quebra o texto de entrada nos dois tokens a seguir, associando atributos como deslocamentos inicial e final (usados para realçar ocorrências), bem como sua posição (usada para correspondência de 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
    }
  ]
}

Exceções para análise léxicaExceptions to lexical analysis

A análise léxica só se aplica a tipos de consultas que exigem termos completos – uma consulta de termo ou uma consulta de frase.Lexical analysis applies only to query types that require complete terms – either a term query or a phrase query. Ela não se aplica aos tipos de consulta com termos incompletos – consulta de prefixo, consulta de caractere curinga, consulta regex – ou a uma consulta difusa.It doesn’t apply to query types with incomplete terms – prefix query, wildcard query, regex query – or to a fuzzy query. Esses tipos de consulta, incluindo a consulta de prefixo com o termo air-condition* em nosso exemplo, são adicionados diretamente à árvore de consulta, ignorando o estágio de análise.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. A única transformação realizada em termos de consulta desses tipos é colocá-los em letras minúsculas.The only transformation performed on query terms of those types is lowercasing.

Estágio 3: Recuperação de documentosStage 3: Document retrieval

A recuperação de documentos se refere à procura de documentos com correspondência de termos no índice.Document retrieval refers to finding documents with matching terms in the index. Este estágio é melhor compreendido por meio de um exemplo.This stage is understood best through an example. Vamos começar com um índice de hotéis com o esquema simples a seguir: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 }
    ] 
} 

Suponhamos ainda que esse índice contém os quatro documentos a seguir: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"
        }
    ]
}

Como os termos são indexadosHow terms are indexed

Para entender a recuperação, é útil conhecer algumas noções básicas sobre indexação.To understand retrieval, it helps to know a few basics about indexing. A unidade de armazenamento é um índice invertido, um para cada campo pesquisável.The unit of storage is an inverted index, one for each searchable field. Dentro de um índice invertido está uma lista classificada de todos os termos de todos os documentos.Within an inverted index is a sorted list of all terms from all documents. Cada termo é mapeado para a lista de documentos nos quais ele ocorre, tão evidente no exemplo a seguir.Each term maps to the list of documents in which it occurs, as evident in the example below.

Para produzir os termos de um índice invertido, o mecanismo de pesquisa executa a análise léxica do o conteúdo dos documentos, de forma semelhante ao que acontece durante o processamento da consulta: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. As entradas de texto são passadas para um analisador, em letras minúsculas, sem pontuação e assim por diante, dependendo da configuração do analisador.Text inputs are passed to an analyzer, lower-cased, stripped of punctuation, and so forth, depending on the analyzer configuration.
  2. Os tokens são a saída de análise lexical.Tokens are the output of lexical analysis.
  3. Termos são adicionados ao índice.Terms are added to the index.

É comum, mas não obrigatório, usar os mesmo analisadores para operações de indexação para que os termos da consulta pareçam mais com os termos dentro do índice.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.

Observação

O Pesquisa Cognitiva do Azure permite que você especifique diferentes analisadores para indexação e pesquisa por meio indexAnalyzer de parâmetros de campo e adicionais searchAnalyzer .Azure Cognitive Search lets you specify different analyzers for indexing and search via additional indexAnalyzer and searchAnalyzer field parameters. Se não forem especificados, o analisador definido com a propriedade analyzer é usado para indexação e pesquisa.If unspecified, the analyzer set with the analyzer property is used for both indexing and searching.

Índice invertido para documentos de exemploInverted index for example documents

Retornando ao nosso exemplo, para o campo título, o índice invertido tem esta aparência:Returning to our example, for the title field, the inverted index looks like this:

TermoTerm Lista de documentosDocument list
atmanatman 11
praiabeach 22
hotelhotel 1, 31, 3
marocean 44
playaplaya 33
resortresort 33
retiroretreat 44

No campo título, apenas hotel aparece em dois documentos: 1, 3.In the title field, only hotel shows up in two documents: 1, 3.

Para o campo descrição, o índice é o seguinte:For the description field, the index is as follows:

TermoTerm Lista de documentosDocument list
aéreaair 33
eand 44
praiabeach 11
condicionadoconditioned 33
confortávelcomfortable 33
distânciadistance 11
ilhaisland 22
kauaʻikauaʻi 22
locallocated 22
northnorth 22
marocean 1, 2, 31, 2, 3
deof 22
onon 22
silenciosoquiet 44
quartosrooms 1, 31, 3
reservadosecluded 44
beira-marshore 22
espaçosospacious 11
othe 1, 21, 2
parato 11
exibiçãoview 1, 2, 31, 2, 3
a péwalking 11
porwith 33

Correspondência de termos de consulta com os termos indexadosMatching query terms against indexed terms

Considerando os índices invertidos acima, vamos voltar para a consulta de exemplo e ver como documentos com correspondência são encontrados para a nossa consulta de exemplo.Given the inverted indices above, let’s return to the sample query and see how matching documents are found for our example query. Lembre-se de que a árvore de consulta final tem esta aparência:Recall that the final query tree looks like this:

Consulta booliana com termos analisados

Durante a execução de consulta, consultas individuais são executadas nos campos pesquisáveis de independente.During query execution, individual queries are executed against the searchable fields independently.

  • A pesquisa do termo, "espaçoso", corresponde ao documento 1 (Hotel Atman).The TermQuery, "spacious", matches document 1 (Hotel Atman).

  • A consulta de prefixo, "ar-condicio *", não corresponde a nenhum documento.The PrefixQuery, "air-condition*", doesn't match any documents.

    Esse é um comportamento que às vezes confunde os desenvolvedores.This is a behavior that sometimes confuses developers. Embora o termo com ar condicionado exista no documento, ele é dividido em dois termos pelo analisador padrão.Although the term air-conditioned exists in the document, it is split into two terms by the default analyzer. Lembre-se de que as consultas de prefixo, que contêm termos parciais, não são analisadas.Recall that prefix queries, which contain partial terms, are not analyzed. Portanto, os termos com o prefixo "ar-condicio" são pesquisados no índice invertido e não são encontrados.Therefore terms with prefix "air-condition" are looked up in the inverted index and not found.

  • A consulta de frase, "vista para o mar", procura os termos "mar" e "vista para o" e verifica a proximidade dos termos no documento original.The PhraseQuery, "ocean view", looks up the terms "ocean" and "view" and checks the proximity of terms in the original document. Os documentos 1, 2 e 3 correspondem a essa consulta no campo descrição.Documents 1, 2 and 3 match this query in the description field. Observe que o documento 4 possui o termo mar termo no título, mas não é considerado uma correspondência, pois estamos procurando a frase "vista para o mar" em vez de palavras individuais.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.

Observação

Uma consulta de pesquisa é executada de forma independente em todos os campos pesquisáveis no índice Pesquisa Cognitiva do Azure, a menos que você limite os campos definidos com o searchFields parâmetro, conforme ilustrado na solicitação de pesquisa de exemplo.A search query is executed independently against all searchable fields in the Azure Cognitive Search index unless you limit the fields set with the searchFields parameter, as illustrated in the example search request. Os documentos correspondentes em qualquer um dos campos selecionados são retornados.Documents that match in any of the selected fields are returned.

De modo geral, para a consulta em questão, os documentos que correspondem são 1, 2, 3.On the whole, for the query in question, the documents that match are 1, 2, 3.

Estágio 4: PontuaçãoStage 4: Scoring

Todos os documentos em um conjunto de resultados de pesquisa recebe uma pontuação de relevância.Every document in a search result set is assigned a relevance score. A função da pontuação de relevância é classificar com uma pontuação mais alta os documentos que melhor respondem a uma pergunta do usuário melhor conforme expressa pela consulta de pesquisa.The function of the relevance score is to rank higher those documents that best answer a user question as expressed by the search query. A pontuação é calculada com base nas propriedades estatísticas dos termos com correspondência.The score is computed based on statistical properties of terms that matched. A fórmula da pontuação é basicamente TF/IDF (frequência do termo sobre frequência inversa do documento).At the core of the scoring formula is TF/IDF (term frequency-inverse document frequency). Em consultas que contêm termos comuns e raros, TF/IDF fornece resultados que contêm o termo raro.In queries containing rare and common terms, TF/IDF promotes results containing the rare term. Por exemplo, em um índice hipotético com todos os artigos da Wikipédia, de documentos que correspondem à consulta o presidente, os documentos com correspondência para presidente são considerados mais relevantes do que os documentos com correspondência para o.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.

Exemplo de pontuaçãoScoring example

Lembre-se dos três documentos que correspondem à nossa consulta de exemplo: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."
    }
  ]
}

O documento 1 foi o que melhor correspondeu à consulta, pois tanto o termo espaçoso como a frase solicitada vista para o mar ocorrem no campo descrição.Document 1 matched the query best because both the term spacious and the required phrase ocean view occur in the description field. Os próximos dois documentos correspondem apenas à frase vista para o mar.The next two documents match only the phrase ocean view. Pode ser surpreendente que as pontuações de relevância para os documentos 2 e 3 sejam diferentes, mesmo que ambos tenham correspondido à consulta da mesma maneira.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. Isso ocorre porque a fórmula de pontuação tem mais componentes do que simplesmente TF/IDF.It's because the scoring formula has more components than just TF/IDF. Nesse caso, o documento 3 recebeu uma pontuação ligeiramente mais alta porque sua descrição é mais curta.In this case, document 3 was assigned a slightly higher score because its description is shorter. Saiba mais sobre a Fórmula de pontuação prática do Lucene para entender como o tamanho do campo e outros fatores podem influenciar a pontuação de relevância.Learn about Lucene's Practical Scoring Formula to understand how field length and other factors can influence the relevance score.

Alguns tipos de consulta (caractere curinga, prefixo, regex) sempre contribuem com uma pontuação constante para a pontuação total do documento.Some query types (wildcard, prefix, regex) always contribute a constant score to the overall document score. Isso permite que as correspondências encontradas por meio da expansão de consulta sejam incluídas nos resultados, mas sem afetar a classificação.This allows matches found through query expansion to be included in the results, but without affecting the ranking.

Um exemplo ilustra por que isso é importante.An example illustrates why this matters. Pesquisas com caractere curinga, inclusive pesquisas de prefixo são ambíguas por definição, porque a entrada é uma cadeia de caracteres parcial com correspondências possíveis em um grande número de termos diferentes (considere uma entrada de "pass *", com correspondências encontradas em "passeios", "passagem" e "passarela").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”). Dada a natureza desses resultados, não é possível inferir de forma razoável quais termos são mais valiosos do que outros.Given the nature of these results, there is no way to reasonably infer which terms are more valuable than others. Por esse motivo, podemos ignorar as frequências dos termos ao pontuar resultados em consultas dos tipos caractere curinga, prefixo e regex.For this reason, we ignore term frequencies when scoring results in queries of types wildcard, prefix and regex. Em uma solicitação de pesquisa de várias partes que inclui termos parciais e completos, os resultados da entrada parcial são incorporados com uma pontuação de constante para evitar desvios em relação às correspondências potencialmente inesperadas.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.

Ajuste da pontuaçãoScore tuning

Há duas maneiras de ajustar as pontuações de relevância no Azure Pesquisa Cognitiva:There are two ways to tune relevance scores in Azure Cognitive Search:

  1. Perfis de pontuação melhoram a classificação dos documentos na lista classificada de resultados com base em um conjunto de regras.Scoring profiles promote documents in the ranked list of results based on a set of rules. Em nosso exemplo, podemos considerar a possibilidade de que os documentos correspondentes no campo de título são mais relevante do que os documentos correspondentes no campo descrição.In our example, we could consider documents that matched in the title field more relevant than documents that matched in the description field. Além disso, se o índice tiver um campo preço para cada hotel, poderíamos promover documentos com preços mais baixos.Additionally, if our index had a price field for each hotel, we could promote documents with lower price. Saiba mais sobre como adicionar perfis de pontuação a um índice de pesquisa.Learn more how to add Scoring Profiles to a search index.
  2. Incremento de termo (disponível apenas na sintaxe da consulta Lucene completo) fornece um operador de incremento ^ que pode ser aplicado a qualquer parte da árvore de consulta.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. Em nosso exemplo, em vez de Pesquisar o prefixo Air-Condition * , é possível pesquisar o termo exato Air-Condition ou o prefixo, mas os documentos que correspondem no termo exato são classificados mais altos aplicando Boost à consulta de termo: * Air-Condition ^ 2 | | ar-condição * *.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**. Saiba mais sobre incremento do termo.Learn more about term boosting.

Pontuação em um índice distribuídoScoring in a distributed index

Todos os índices no Azure Pesquisa Cognitiva são divididos automaticamente em vários fragmentos, permitindo que possamos distribuir rapidamente o índice entre vários nós durante o escalonamento ou redução vertical do serviço.All indexes in Azure Cognitive 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 uma solicitação de pesquisa é emitida, ela é emitida em relação a cada fragmento de forma independente.When a search request is issued, it’s issued against each shard independently. Os resultados de cada fragmento são então mesclados e ordenados conforme a pontuação (se nenhuma outra ordem for definida).The results from each shard are then merged and ordered by score (if no other ordering is defined). É importante saber que a função de pontuação faz a ponderação da frequência do termo de consulta em relação a sua frequência de documento inversa em todos os documentos dentro do fragmento, não em todos os fragmentos!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!

Isso significa que uma pontuação de relevância pode ser diferentes para documentos idênticos se estes estiverem em fragmentos diferentes.This means a relevance score could be different for identical documents if they reside on different shards. Felizmente, essas diferenças tendem a desaparecer conforme aumenta o número de documentos no índice devido a uma distribuição de termo mais uniforme.Fortunately, such differences tend to disappear as the number of documents in the index grows due to more even term distribution. Não é possível supor em qual fragmento qualquer documento especificado será colocado.It’s not possible to assume on which shard any given document will be placed. No entanto, supondo que uma chave de documento não é alterado, ela sempre será atribuída ao mesmo fragmento.However, assuming a document key doesn't change, it will always be assigned to the same shard.

Em geral, a pontuação de documentos não é o melhor atributo para classificar documentos se a estabilidade da classificação for importante.In general, document score is not the best attribute for ordering documents if order stability is important. Por exemplo, considerando dois documentos com uma pontuação idêntica, não há nenhuma garantia de qual aparece primeiro nas execuções posteriores da mesma consulta.For example, given two documents with an identical score, there is no guarantee which one appears first in subsequent runs of the same query. A pontuação de documento deve dar somente uma noção geral de relevância do documento em relação a outros documentos no conjunto de resultados.Document score should only give a general sense of document relevance relative to other documents in the results set.

ConclusãoConclusion

O sucesso dos mecanismos de pesquisa da Internet gerou expectativas para a pesquisa de texto completo em dados particulares.The success of internet search engines has raised expectations for full text search over private data. Para quase qualquer tipo de experiência de pesquisa, esperamos que o mecanismo entenda a nossa intenção, mesmo quando os termos estão incorretos ou incompletos.For almost any kind of search experience, we now expect the engine to understand our intent, even when terms are misspelled or incomplete. Esperamos até correspondências com base em termos equivalentes ou sinônimos que nem especificamos.We might even expect matches based on near equivalent terms or synonyms that we never actually specified.

Do ponto de vista técnico, a pesquisa de texto completo é altamente complexa, exigindo uma análise linguística sofisticada e uma abordagem sistemática para processamento de forma a extrair, expandir e transformar os termos da consulta para fornecer um resultado relevante.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. Devido às complexidades inerentes, há muitos fatores que podem afetar o resultado de uma consulta.Given the inherent complexities, there are a lot of factors that can affect the outcome of a query. Por esse motivo, investir tempo para entender os mecanismos de pesquisa de texto completo oferece benefícios tangíveis quando se tenta trabalhar com resultados inesperados.For this reason, investing the time to understand the mechanics of full text search offers tangible benefits when trying to work through unexpected results.

Este artigo explorou a pesquisa de texto completo no contexto do Azure Pesquisa Cognitiva.This article explored full text search in the context of Azure Cognitive Search. Esperamos que todas essas informações sejam o suficiente para você reconhecer possíveis causas e resoluções para resolver problemas comuns de consulta.We hope it gives you sufficient background to recognize potential causes and resolutions for addressing common query problems.

Próximas etapasNext steps

Veja tambémSee also

API REST para pesquisar documentosSearch Documents REST API

Sintaxe de consulta simplesSimple query syntax

Sintaxe de consulta Lucene completaFull Lucene query syntax

Controlar os resultados da pesquisaHandle search results