Consulta com pesquisa de texto completo

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Escreva consultas de texto completo usando os predicados CONTAINS e FREETEXT e as funções com valor de conjunto de linhas CONTAINSTABLE e FREETEXTTABLE com uma instrução SELECT. Este artigo fornece exemplos de cada predicado e função e ajuda você a escolher o melhor a ser usado.

  • Para combinar palavras e frases, use CONTAINS e CONTAINSTABLE.
  • Para corresponder ao significado, mas não à redação exata, use FREETEXT e FREETEXTTABLE.

Exemplos de cada predicado e função

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

Para executar as consultas de exemplo, você também deve configurar a pesquisa de texto completo. Para mais informações, consulte Introdução à Busca de Texto Completo.

Exemplo: CONTÉM

O exemplo a seguir localiza todos os produtos com um preço de $80.99 contendo a palavra Mountain:

USE AdventureWorks2025;
GO

SELECT Name,
       ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
      AND CONTAINS ((Name), 'Mountain');
GO

Exemplo: TEXTO LIVRE

O exemplo a seguir pesquisa todos os documentos que contêm palavras relacionadas a vital safety components:

USE AdventureWorks2025;
GO

SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO

Exemplo: CONTAINSTABLE

O exemplo a seguir retorna o ID da descrição e a descrição de todos os produtos para os quais a Description coluna contém a palavra aluminum próxima à palavra light ou à palavra lightweight. Apenas as linhas com classificação superior a 2 são devolvidas.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Exemplo: FREETEXTTABLE

O exemplo a seguir estende uma FREETEXTTABLE consulta para retornar primeiro as linhas mais bem ranqueadas e adicionar a classificação de cada linha à lista de seleção. Para escrever uma consulta semelhante, você precisa saber que essa ProductDescriptionID é a única coluna chave da ProductDescription tabela.

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Esta é uma extensão da mesma consulta que retorna apenas as linhas com classificação 10 ou maior:

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Corresponder palavras ou significado

CONTAINS e CONTAINSTABLE, ou FREETEXT e FREETEXTTABLE, são úteis para diferentes tipos de pareamento. As informações a seguir ajudam você a escolher o melhor predicado ou função para sua consulta:

CONTAINS e CONTAINSTABLE

  • Combine palavras isoladas e frases com correspondências exatas ou aproximadas (menos precisas).
  • Você também pode fazer o seguinte:
    • Especifique a proximidade de palavras dentro de uma determinada distância uma da outra.
    • Retorne correspondências ponderadas.
    • Combine critérios de pesquisa com operadores lógicos. Para mais informações, veja Use operadores booleanos (AND, OR e NOT) mais adiante neste artigo.

FREETEXT e FREETEXTTABLE

  • Faça a correspondência de significado, mas não de palavras exatas, palavras especificadas ou frases (a cadeia de caracteres de texto livre).
  • As correspondências serão geradas se qualquer termo ou forma de qualquer termo for encontrada no índice de texto completo de uma coluna especificada.

Comparar predicados e funções

Os predicados CONTAINS ou FREETEXT e as funções CONTAINSTABLE ou FREETEXTTABLE, que retornam conjuntos de linhas, têm sintaxe e opções diferentes. As informações a seguir ajudam você a escolher o melhor predicado ou função para sua consulta:

Predicados CONTAINS e FREETEXT

Uso. Use os predicados de texto completo CONTAINS e FREETEXT na cláusula WHERE ou HAVING de uma instrução SELECT.

Resultados. Os predicados CONTAINS e FREETEXT retornam um valor TRUE ou FALSE que indica se uma determinada linha corresponde à consulta de texto completo. As linhas correspondentes são retornadas no conjunto de resultados.

Mais opções. Você pode combinar os predicados com qualquer um dos outros Transact-SQL predicados, como LIKE e BETWEEN.

Especifique se uma única coluna, uma lista de colunas ou todas as colunas da tabela devem ser pesquisadas.

Opcionalmente, você pode especificar o idioma cujos recursos são usados pela consulta de texto completo para a quebra de palavras e lematização, pesquisas no dicionário de sinônimos e remoção de palavras de ruído.

Você pode usar um nome de quatro partes no predicado CONTAINS ou FREETEXT para consultar colunas com índice de texto completo das tabelas de destino em um servidor vinculado. Para preparar um servidor remoto para receber consultas de texto completo, crie um índice de texto completo nas tabelas e colunas de destino no servidor remoto e, em seguida, adicione o servidor remoto como um servidor vinculado.

Para mais informações sobre a sintaxe e os argumentos desses predicados, veja CONTAINS e FREETEXT.

Funções com valor de conjunto de linhas CONTAINSTABLE e FREETEXTTABLE

Uso. Use as funções de texto completo CONTAINSTABLE e FREETEXTTABLE como um nome de tabela regular na cláusula FROM de uma instrução SELECT.

Você precisa especificar a tabela base a ser pesquisada ao usar uma dessas funções. Assim como nos predicados, você pode especificar uma única coluna, uma lista de colunas ou todas as colunas da tabela a ser pesquisada e, se preferir, o idioma cujos recursos são usados por uma dada consulta de texto completo.

Normalmente, você precisa juntar os resultados de CONTAINSTABLE ou FREETEXTTABLE com a tabela base. Para unir as tabelas, é necessário saber o nome da coluna de chave única. Essa coluna, que ocorre em toda tabela habilitada para texto completo, é usada para impor linhas únicas para a tabela (a coluna chave única). Para mais informações sobre a coluna-chave, veja Criar e gerenciar índices em texto completo.

Resultados. Essas funções retornam uma tabela com zero, uma ou várias linhas que correspondem à consulta de texto completo. A tabela retornada contém somente as linhas da tabela base que correspondem aos critérios de seleção especificados no critério de pesquisa de texto completo da função.

Consultas que utilizam uma dessas funções também retornam um valor de classificação de relevância (RANK) e uma chave de texto completo (KEY) para cada linha retornada, da seguinte forma:

  • KEY coluna. A KEY coluna retorna valores únicos das linhas retornadas. A KEY coluna pode ser usada para especificar critérios de seleção.

  • RANK coluna. A RANK coluna retorna um valor de classificação para cada linha que indica o quão bem a linha correspondeu aos critérios de seleção. Quanto mais alto o valor de classificação do texto ou documento em uma linha, mais relevante será a linha para a consulta de texto completo especificada. Diferentes linhas podem ter a mesma classificação. É possível limitar o número de correspondências a serem retornadas especificando o parâmetro opcional top_n_by_rank . Para mais informações, veja Limitar resultados de busca com classificação.

Para mais informações sobre a sintaxe e os argumentos dessas funções, veja CONTAINSTABLE e FREETEXTTABLE.

Tipos específicos de pesquisas

Procure por uma palavra ou expressão específica (termo simples)

Você pode usar CONTAINS, CONTAINSTABLE, FREETEXT, , ou FREETEXTTABLE buscar em uma tabela uma palavra ou frase específica. Por exemplo, se você quiser pesquisar na ProductReview tabela do AdventureWorks2025 banco de dados para encontrar todos os comentários sobre um produto com a frase learning curve, você pode usar o CONTAINS predicado da seguinte forma:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

A condição de busca, neste caso learning curve, pode ser complexa e pode ser composta por um ou mais termos.

Mais informações sobre buscas de termos simples

Na pesquisa de texto completo, uma palavra (ou token) é uma cadeia de caracteres cujos limites são identificados pelas quebras de palavras apropriadas, seguindo as regras linguísticas do idioma especificado. Uma frase válida consiste em várias palavras, com ou sem sinais de pontuação entre elas.

Por exemplo, croissant é uma palavra, e café au lait é uma frase. Palavras e expressões como essas são chamadas de termos simples.

CONTAINS e CONTAINSTABLE procure uma correspondência exata para a frase. FREETEXT e FREETEXTTABLE separam a frase em palavras individuais.

Procure por uma palavra com prefixo (termo prefixo)

Você pode usar CONTAINS ou CONTAINSTABLE buscar palavras ou frases com um prefixo especificado. Todas as entradas na coluna que contêm o texto que começa com o prefixo especificado são retornadas. Por exemplo, para buscar todas as linhas que contêm o prefixo top-, como em topple, topping, e top, a consulta é o seguinte exemplo:

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Todo texto que corresponder ao texto especificado antes do asterisco (*) será retornado. Se o texto e o asterisco não forem delimitados por aspas duplas, como em CONTAINS (DESCRIPTION, 'top*'), a busca em texto completo não considera o asterisco como um coringa.

Quando o termo de prefixo for uma frase, todos os tokens que constituírem a frase serão considerados termos de prefixo separados. Todas as linhas que têm palavras começando com os termos prefixos são devolvidas. Por exemplo, o termo de prefixo light bread* encontra linhas que contêm o texto light breaded, lightly breaded ou light bread, mas não retorna lightly toasted bread.

Mais informações sobre buscas por prefixo

Um termo de prefixo refere-se a uma cadeia de caracteres colocada na frente de uma palavra para gerar uma palavra derivada ou uma forma flexionada.

  • Para um único termo prefixo, qualquer palavra que comece com o termo especificado faz parte do conjunto de resultados. Por exemplo, o termo auto* corresponde a automatic, automobile e assim por diante.

  • Para uma frase, cada palavra é considerada um termo de prefixo. Por exemplo, o termo auto tran* corresponde a automatic transmission e a automobile transducer, mas não corresponde a automatic motor transmission.

Buscas de prefixo são suportadas por CONTAINS e CONTAINSTABLE.

Pesquisar as formas flexionadas de uma palavra específica (termo de geração)

Você pode usar CONTAINS, CONTAINSTABLE, FREETEXT, ou FREETEXTTABLE para buscar todos os diferentes tempos e conjugações de um verbo ou tanto as formas singular quanto plural de um substantivo (uma busca flexiva) ou formas sinônimas de uma palavra específica (busca por dicionário de sinônimos).

O exemplo a seguir busca por qualquer forma de foot (foot, feet, e assim por diante) na Comments coluna da ProductReview tabela do AdventureWorks2025 banco de dados:

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

A pesquisa de texto completo usa stemmers, que permitem pesquisar diferentes tempos verbais e conjugações de um verbo, bem como as formas no singular e no plural de um substantivo. Para obter mais informações sobre lematizadores, consulte Configurar e gerenciar separadores de palavras e lematizadores para pesquisa.

Mais informações sobre buscas de termos geracionais

As formas flexionadas são os diferentes tempos e conjugações de um verbo ou as formas singular e plural de um substantivo.

Por exemplo, procure pela forma flexional da palavra drive. Se várias linhas na tabela contiverem as palavras drive, drives, drove, driving e driven, todas estariam no conjunto de resultados porque cada uma delas pode ser flexionalmente gerada a partir da palavra drive.

FREETEXT e FREETEXTTABLE procuram, por padrão, formas flexionadas de todas as palavras especificadas. CONTAINS e CONTAINSTABLE oferecem suporte a um argumento opcional INFLECTIONAL.

Pesquisar sinônimos de uma palavra específica

Um dicionário de sinônimos define sinônimos especificados pelo usuário para os termos. Para mais informações sobre arquivos de tesauro, consulte Configurar e Gerenciar Arquivos de Tesauro para Pesquisa de Texto Completo.

Por exemplo, se uma entrada , {car, automobile, truck, van}for adicionada a um dicionário de sinônimos, você pode procurar a forma de dicionário de sinônimos da palavra car. Todas as linhas da tabela consultadas que incluem as palavras automobile, truck, van, ou car aparecem no conjunto de resultados porque cada uma dessas palavras pertence ao conjunto de expansão de sinônimos que contém a palavra car.

FREETEXT e FREETEXTTABLE usam o dicionário de sinônimos por padrão. CONTAINS e CONTAINSTABLE aceitam um argumento opcional THESAURUS.

Procure por uma palavra próxima a outra

Um termo de proximidade indica palavras ou frases que estão perto umas das outras. Você também pode especificar o número máximo de termos que não são de pesquisa entre o primeiro e o último termo de pesquisa. Além disso, você pode pesquisar palavras ou frases em qualquer ordem, ou na ordem em que as especificar.

Por exemplo, você quer encontrar as linhas em que a palavra ice está próxima da palavra hockey ou em que a frase ice skating está próxima à frase ice hockey.

Para obter mais informações sobre pesquisas de proximidade, consulte Pesquisar palavras perto de outra palavra com NEAR.

Busque palavras ou frases usando valores ponderados (termo ponderado)

Você pode usar CONTAINSTABLE para buscar palavras ou expressões e especificar um valor de peso. A ponderação, medida como um número de 0,0 a 1,0, indica a importância de cada palavra e frase em um conjunto de palavras e frases. Um peso 0,0 é o mais baixo, e um peso 1,0 é o mais alto.

O exemplo a seguir mostra uma consulta que procura todos os endereços de clientes usando pesos, nos quais qualquer texto que comece com a cadeia de caracteres Bay tem também Street ou View. Os resultados dão uma classificação maior para as linhas que contêm mais palavras especificadas.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Um termo ponderado pode ser usado junto com qualquer termo simples, termo de prefixo, termo de geração ou termo de proximidade.

Mais informações sobre buscas de termos ponderadas

Em uma pesquisa de termo ponderado, um valor de ponderação indica o grau de importância de cada palavra e frase em um conjunto de palavras e frases. Um valor ponderado de 0,0 é o mais baixo e um valor ponderado de 1,0 é o mais alto.

Por exemplo, em uma consulta que busca vários termos, é possível atribuir a cada termo de pesquisa um valor de peso que indica sua importância em relação aos outros termos na condição de pesquisa. O resultado desse tipo de consulta retorna primeiro as linhas mais relevantes, de acordo com o peso relativo atribuído às palavras da pesquisa. Os conjuntos de resultados contêm documentos ou linhas contendo qualquer um dos termos especificados (ou conteúdo entre eles); No entanto, alguns resultados são considerados mais relevantes que outros devido à variação nos valores ponderados associados a diferentes termos buscados.

Buscas de termos ponderadas são suportadas por CONTAINSTABLE.

Usar AND, OR e NOT (operadores boolianos)

O predicado CONTAINS e a função CONTAINSTABLE usam as mesmas condições de busca. Ambos suportam a combinação de vários termos de busca usando operadores booleanos (AND, OR, e NOT) para realizar operações lógicas. Você pode usar AND, por exemplo, para encontrar linhas que contenham tanto latte quanto New York-style bagel. Você pode usar AND NOT, por exemplo, para encontrar as linhas que contêm bagel , mas não contêm cream cheese.

Em contraste, FREETEXT e FREETEXTTABLE trate os termos booleanos como palavras a serem pesquisadas.

Para informações sobre como combinar CONTAINS com outros predicados que utilizam os operadores lógicos AND, OR e NOT, veja Condição de pesquisa.

Exemplo

O exemplo a seguir usa o CONTAINS predicado para buscar descrições em que o ID da descrição não seja igual a 5 e a descrição contenha tanto a palavra Aluminum quanto a palavra spindle. A condição de busca usa o AND operador booleano. Este exemplo usa a ProductDescription tabela do AdventureWorks2025 banco de dados.

USE AdventureWorks2025;
GO

SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
      AND CONTAINS ((Description), 'aluminum AND spindle');
GO

Maiúsculas e minúsculas, palavras irrelevantes, idioma e dicionário de sinônimos

Ao escrever consultas de texto completo, você também poderá especificar as opções a seguir:

  • Diferenciação de maiúsculas e minúsculas. As consultas de busca de texto completo não diferenciam letras maiúsculas de minúsculas. No entanto, em japonês há várias ortografias fonéticas em que o conceito de normalização ortográfica é parecido à não diferenciação de maiúsculas e minúsculas (por exemplo, kana = não diferenciação). Esse tipo de normalização ortográfica não é suportado.

  • Palavras irrelevantes. Quando você define uma consulta em texto completo, o Full-Text Engine descarta palavras de parada (também chamadas de palavras de ruído) dos critérios de busca. Palavras de parada são palavras como a, and, is, ou the, que podem ocorrer com frequência, mas que normalmente não ajudam na busca por um texto específico. As palavras irrelevantes são relacionadas em uma lista de palavras irrelevantes. Cada índice de texto completo é associado a uma lista de palavras irrelevantes específica, que determina quais palavras irrelevantes são omitidas da consulta ou do índice no momento da indexação. Para mais informações, consulte Configurar e gerenciar palavras de parada e listas de palavras de parada para Pesquisa de Texto Completo.

  • Idioma, com a opção LANGUAGE . Muitos termos de consulta dependem bastante do comportamento do separador de palavras. Para garantir que você esteja usando o separador de palavras (e o arquivo de dicionário correto) e o dicionário de sinônimos, é necessário especificar essa LANGUAGE opção. Para mais informações, veja Escolha uma linguagem ao criar um índice em texto completo.

  • Dicionário de sinônimos. FREETEXT e FREETEXTTABLE consultas usam o dicionário de sinônimos por padrão. CONTAINS e CONTAINSTABLE aceitam um argumento opcional THESAURUS. Para obter mais informações, veja Configurar e gerenciar arquivos de dicionário de sinônimos para pesquisa de texto completo.

Verificar os resultados da geração de tokens

Depois de aplicar determinada combinação de separador de palavras, dicionário de sinônimos e lista de palavras irrelevantes a uma consulta, você poderá ver como a pesquisa de texto completo gera tokens dos resultados usando a exibição de gerenciamento dinâmico sys.dm_fts_parser. Para mais informações, veja sys.dm_fts_parser.