Partilhar via


Pesquisa com Full-Text

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada 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 para usar.

  • Para fazer corresponder palavras e frases, use CONTÉM 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 a seguir usam o banco de dados de exemplo AdventureWorks. Para a versão final do AdventureWorks, consulte os bancos de dados de exemplo AdventureWorks. Para executar as consultas de exemplo, é necessário também configurar o motor de pesquisa Full-Text. Para obter mais informações, consulte Introdução a Full-Text Pesquisa.

Exemplo - CONTÉM

O exemplo a seguir localiza todos os produtos com um preço de $80.99 que contêm a palavra "Mountain":

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

Exemplo - TEXTO LIVRE

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

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

Exemplo - CONTAINSTABLE

O exemplo a seguir retorna a ID da descrição e a descrição de todos os produtos para os quais a coluna Descrição contém a palavra "alumínio" perto da palavra "light" ou da palavra "lightweight". Apenas as linhas com uma classificação igual ou superior a 2 são devolvidas.

USE AdventureWorks2022  
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 consulta FREETEXTTABLE para retornar as linhas mais bem classificadas primeiro e adicionar a classificação de cada linha à lista de seleção. Para escrever uma consulta semelhante, você precisa saber que ProductDescriptionID é a coluna de chave exclusiva para a tabela ProductDescription.

USE AdventureWorks2022  
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  

Aqui está uma extensão da mesma consulta que só retorna linhas com uma classificação de 10 ou superior:

USE AdventureWorks2022  
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  

Combinar palavras ou o significado

CONTAINS / CONTAINSTABLE e FREETEXT/FREETEXTTABLE são úteis para diferentes tipos de correspondência. As seguintes informações ajudam-no a escolher o melhor predicado ou função para a sua consulta:

CONTÉM/CONTÉMESTÁVEL

  • Combine palavras e frases simples com correspondências precisas ou difusas.
  • Você também pode fazer o seguinte:
    • Especifique a proximidade das palavras dentro de uma certa distância umas das outras.
    • Retornar partidas ponderadas.
    • Combine condições de pesquisa com operadores lógicos. Para obter mais informações, consulte Usando operadores booleanos (E, OU e NÃO) mais adiante neste artigo.

TEXTO LIVRE/TABELA DE TEXTO LIVRE

  • Corresponder o significado, mas não a redação exata, de palavras, frases ou frases especificadas (a cadeia de texto livre ).
  • As correspondências são geradas se qualquer termo ou forma de qualquer termo for encontrado no índice de texto completo de uma coluna especificada.

Comparar predicados e funções

Os predicados CONTAINS/FREETEXT e as funções com valor de conjunto de linhas CONTAINSTABLE/FREETEXTTABLE têm sintaxe e opções diferentes. As seguintes informações ajudam-no a escolher o melhor predicado ou função para a sua consulta:

Predicados CONTÉM e TEXTO LIVRE

Utilização. 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 predicados Transact-SQL, como LIKE e BETWEEN.

Você pode especificar uma única coluna, uma lista de colunas ou todas as colunas na tabela a ser pesquisada.

Opcionalmente, pode especificar o idioma cujos recursos são utilizados na consulta de texto completo para quebra e derivação de palavras, consulta de sinônimos e remoção de palavras irrelevantes.

Você pode usar um nome de quatro partes no predicado CONTAINS ou FREETEXT para consultar colunas indexadas 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.

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

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

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

Você precisa especificar a tabela base para pesquisar quando usar qualquer uma dessas funções. Tal como acontece com os predicados, pode especificar uma única coluna, uma lista de colunas ou todas as colunas na tabela a pesquisar e, opcionalmente, a língua cujos recursos são utilizados por uma determinada consulta de texto completo.

Normalmente, você tem que juntar os resultados de CONTAINSTABLE ou FREETEXTTABLE com a tabela base. Para juntar as tabelas, tem de saber o nome exclusivo da coluna da chave. Esta coluna, que ocorre em todas as tabelas com capacidade para texto completo, é usada para garantir linhas únicas na tabela (a coluna de chave exclusiva **). Para obter mais informações sobre a coluna principal, consulte Criar e gerenciar índices Full-Text.

Resultados. Essas funções retornam uma tabela de zero, uma ou mais linhas que correspondem à consulta de texto completo. A tabela retornada contém apenas linhas da tabela base que correspondem aos critérios de seleção especificados na condição de pesquisa de texto completo da função.

As consultas que usam 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 maneira:

  • KEY coluna. A coluna KEY retorna valores exclusivos das linhas retornadas. A coluna KEY pode ser usada para especificar critérios de seleção.
  • RANQUE coluna. A coluna RANK retorna um valor de classificação para cada linha que indica quão bem a linha correspondeu aos critérios de seleção. Quanto maior o valor de classificação do texto ou documento em uma linha, mais relevante a linha é para a consulta de texto completo dada. Diferentes linhas podem ser classificadas de forma idêntica. Você pode limitar o número de correspondências a serem retornadas especificando o parâmetro opcional top_n_by_rank. Para obter mais informações, consulte Limitar resultados de pesquisa com RANK.

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

Tipos específicos de pesquisas

Procurar uma palavra ou frase específica (Termo Simples)

Você pode usar CONTAINS, CONTAINSTABLE, FREETEXTou FREETEXTTABLE para pesquisar uma tabela para uma palavra ou frase específica. Por exemplo, se você quiser pesquisar a tabela ProductReview no banco de dados AdventureWorks2025 para encontrar todos os comentários sobre um produto com a frase "curva de aprendizado", você pode usar o predicado CONTAINS da seguinte maneira:

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

A condição de pesquisa, neste caso "curva de aprendizagem", pode ser complexa e pode ser composta por um ou mais termos.

Mais informações sobre pesquisas simples de termos

Na pesquisa de texto completo, uma palavra (ou token) é uma cadeia cujos limites são identificados por separadores de palavras apropriados, 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é com leite" é uma frase. Palavras e frases como estas são chamadas de termos simples.

CONTÉM e CONTÉM procure uma correspondência exata para a frase. TEXTO LIVRE e FREETEXTTABLE dividem a frase em palavras separadas.

Procurar uma palavra com um prefixo (Prefix Term)

Você pode usar CONTAINS ou CONTAINSTABLE para procurar palavras ou frases com um prefixo especificado. Todas as entradas na coluna que contêm texto começando com o prefixo especificado são retornadas. Por exemplo, para pesquisar todas as linhas que contêm o prefixo top-, como em top``ple, top``pinge top. A consulta se parece com o exemplo a seguir:

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

Todo o texto que corresponda ao texto especificado antes do asterisco (*) ser retornado. Se o texto e o asterisco não forem delimitados por aspas duplas, como no CONTAINS (DESCRIPTION, 'top*'), a pesquisa de texto completo não considera o asterisco como um curinga.

Quando o termo prefixo é uma frase, cada token que compõe a frase é considerado um termo de prefixo separado. Todas as linhas que têm palavras começando com os termos do prefixo serão retornadas. Por exemplo, o prefixo "pão leve*" encontrará fileiras com texto de "pão leve", "levemente empanado" ou "pão leve", mas não retornará "pão levemente torrado".

Mais informações sobre pesquisas de prefixos

Um termo de prefixo refere-se a uma cadeia de caracteres que é colocada no início de uma palavra para produzir uma palavra derivada ou uma forma flexionada.

  • Para um único termo de prefixo, qualquer palavra que comece com o termo especificado fará parte do conjunto de resultados. Por exemplo, o termo "auto*" corresponde a "automático", "automóvel" e assim por diante.

  • Para uma frase, cada palavra dentro da frase é considerada um termo prefixo. Por exemplo, o termo "auto tran*" corresponde a "transmissão automática" e "transdutor de automóvel", mas não corresponde a "transmissão automática do motor".

As pesquisas de prefixo são suportadas pelo CONTAINS e CONTAINSTABLE.

Pesquisa de formas flexionais de uma palavra específica (Termo Gerado)

Você pode usar CONTÉM, CONTÉM, TEXTO LIVRE ou FREETEXTTABLE para procurar todos os diferentes tempos e conjugações de um verbo ou ambas as formas singular e plural de um substantivo (uma busca flexional) ou formas sinônimas de uma palavra específica (uma pesquisa de dicionário de sinônimos).

O exemplo a seguir procura qualquer forma de "pé" ("pé", "pés" e assim por diante) na coluna Comments da tabela ProductReview no banco de dados AdventureWorks:

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

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

Mais informações sobre pesquisas de termos de geração

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

Por exemplo, procure a forma flexional da palavra "conduzir". Se várias linhas na tabela incluírem as palavras "conduzir", "conduz", "conduziu", "a conduzir" e "conduzido", todas estarão no conjunto de resultados, porque cada uma dessas formas pode ser gerada inflexionalmente a partir da palavra "conduzir".

FREETEXT e FREETEXTTABLE procurar termos flexionais de todas as palavras especificadas por padrão. CONTÉM e CONTAINSTABLE suportam um argumento opcional INFLECTIONAL.

Pesquisar sinónimos de uma palavra específica

Um thesaurus define sinónimos especificados pelo utilizador para termos. Para mais informações sobre arquivos de thesaurus, consulte Configurar e Gerir Arquivos de Thesaurus para Pesquisa Full-Text.

Por exemplo, se uma entrada, "{carro, automóvel, camião, carrinha}," for adicionada a um dicionário de sinónimos, pode procurar a forma de dicionário de sinónimos da palavra "carro". Todas as linhas na tabela consultada que incluem as palavras "automóvel", "caminhão", "van" ou "carro" aparecem no conjunto de resultados porque cada uma dessas palavras pertence ao conjunto de expansão de sinônimo que contém a palavra "carro".

FREETEXT e FREETEXTTABLE usam o dicionário de sinónimos por padrão. CONTÉM e CONTAINSTABLE suportam um argumento opcional THESAURUS.

Procurar uma palavra PERTO de outra palavra

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

Por exemplo, você deseja encontrar as linhas em que a palavra "gelo" está perto da palavra "hóquei" ou em que a frase "patinação no gelo" está perto da frase "hóquei no gelo".

CONTÉM E CONTAINSTABLE

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

Pesquisar palavras ou frases usando valores ponderados (Termo ponderado)

Você pode usar CONTAINSTABLE para pesquisar palavras ou frases e especificar um valor de ponderação. O peso, medido como um número de 0,0 a 1,0, indica a importância de cada palavra e frase dentro de um conjunto de palavras e frases. Um peso de 0,0 é o mais baixo, e um peso de 1,0 é o mais alto.

O exemplo a seguir mostra uma consulta que pesquisa todos os endereços de clientes, usando pesos, em que qualquer texto que comece pela sequência "Bay" contém "Street" ou "View". Os resultados dão uma pontuação mais alta às linhas que contêm mais palavras especificadas.

USE AdventureWorks2022  
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 em conjunto com qualquer termo simples, prefixo, termo de geração ou termo de proximidade.

Mais informações sobre pesquisas de termos ponderados

Em uma pesquisa de termos ponderados, um valor de ponderação indica o grau de importância para cada palavra e frase dentro de um conjunto de palavras e frases. Um valor de peso de 0,0 é o mais baixo, e um valor de peso de 1,0 é o mais alto.

Por exemplo, em uma consulta que pesquisa vários termos, você pode atribuir a cada palavra de pesquisa um valor de peso indicando sua importância em relação às outras palavras na condição de pesquisa. Os resultados desse tipo de consulta retornam as linhas mais relevantes primeiro, de acordo com o peso relativo que você atribuiu às palavras de 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 serão considerados mais relevantes do que outros devido à variação nos valores ponderados associados aos diferentes termos pesquisados.

As pesquisas de termos ponderados são suportadas por CONTAINSTABLE.

Usar E, OU e NÃO (operadores booleanos)

O predicado CONTAINS e a função CONTAINSTABLE usam as mesmas condições de pesquisa. Ambos suportam a combinação de vários termos de pesquisa usando operadores booleanos - AND, OR e NOT - para executar operações lógicas. Você pode usar E, por exemplo, para encontrar linhas que contenham "latte" e "bagel estilo Nova York". Você pode usar E NÃO, por exemplo, para encontrar as linhas que contêm "bagel", mas não contêm "cream cheese".

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

Para obter informações sobre como combinar CONTAINS com outros predicados que usam os operadores lógicos E, OU e NÃO, consulte Condição de pesquisa (Transact-SQL).

Exemplo

O exemplo a seguir usa o predicado CONTAINS para procurar descrições nas quais o ID da descrição não é igual a 5 e a descrição contém a palavra "Alumínio" e a palavra "fuso". A condição de pesquisa usa o operador booleano AND. Este exemplo usa a tabela ProductDescription do banco de dados AdventureWorks2025.

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

Caso, palavras-chave, linguagem e tesauro

Ao escrever consultas de texto completo, você também pode especificar as seguintes opções:

  • Sensibilidade a maiúsculas e minúsculas. As consultas de pesquisa de texto completo não diferenciam maiúsculas de minúsculas. No entanto, em japonês, existem várias ortografias fonéticas em que o conceito de normalização ortográfica é semelhante à insensibilidade ao uso de maiúsculas (por exemplo, kana = insensibilidade). Este tipo de normalização ortográfica não é suportado.

  • Stopwords. Ao definir uma consulta de texto completo, o motor de busca Full-Text descarta palavras de paragem (também chamadas de palavras de ruído) dos critérios de pesquisa. As palavras paradas são palavras como "a", "e", "é" ou "o", que podem ocorrer com frequência, mas que normalmente não ajudam na pesquisa de um determinado texto. As palavras de paragem estão listadas numa lista de interrupção. Cada índice de texto completo é associado a uma lista de interrupção específica, que determina quais palavras de parada são omitidas da consulta ou do índice no momento da indexação. Para obter mais informações, consulte Configurar e gerenciar palavras paradas e listas de paradas para Full-Textde pesquisa .

  • Language, com a opção LANGUAGE. Muitos termos de consulta dependem muito do comportamento do separador de palavras. Para garantir que você está usando o separador de palavras (e lematizador) e o arquivo de dicionário de sinônimos corretos, recomendamos que você especifique a opção LANGUAGE. Para obter mais informações, consulte Escolher um Idioma Quando Criar um Índice Full-Text.

  • Thesaurus. As consultas FREETEXT e FREETEXTTABLE usam o dicionário de sinônimos por padrão. CONTÉM e CONTAINTABLE suportam um argumento THESAURUS opcional. Para mais informações, consulte Configurar e gerir ficheiros de dicionário para Pesquisa Full-Text.

Verifique os resultados da tokenização

Depois de aplicar uma determinada combinação de separador de palavras, dicionário de sinônimos e lista de paradas em uma consulta, você pode ver como Full-Text Pesquisa tokeniza os resultados usando a exibição de gerenciamento dinâmico sys.dm_fts_parser. Para obter mais informações, consulte sys.dm_fts_parser (Transact-SQL).

Ver também

CONTÉM (Transact-SQL)
CONTIDA (Transact-SQL)
TEXTO LIVRE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Criar consultas de pesquisa Full-Text (Visual Database Tools)
Melhorar o desempenho de consultas Full-Text