Visão geral de predicados e funções de texto completo

As consultas de texto completo usam os predicados (CONTAINS e FREETEXT) e as funções (CONTAINSTABLE e FREETEXTTABLE) de texto completo. Elas dão suporte à avançada sintaxe Transact-SQL que comporta uma variedade de formas de termos de consulta. Para gravar consultas de texto completo, você deve saber quando e como usar esses predicados e funções. Este tópico resume os predicados e as funções e aborda os aspectos comuns entre o predicado CONTAINS e a função CONTAINSTABLE.

Visão geral dos predicados de texto completo (CONTAINS e FREETEXT)

CONTAINS e FREETEXT são especificados na cláusula WHERE ou HAVING de uma instrução SELECT. Eles podem ser combinados com qualquer dos outros predicados Transact-SQL, como LIKE e BETWEEN.

Os predicados CONTAINS e FREETEXT retornam um valor TRUE ou FALSE. Eles podem ser usados somente para especificar critérios de seleção para determinar se uma dada linha corresponde à consulta de texto completo. As linhas correspondentes são retornadas no conjunto de resultados.

Ao usar CONTAINS ou FREETEXT, você pode especificar se uma única coluna, uma lista de colunas ou todas as colunas da tabela devem ser pesquisadas. Se preferir, você pode especificar o idioma cujos recursos serão usados por uma dada consulta de texto completo para quebra de palavras e lematização, pesquisas no dicionário de sinônimos e remoção de palavras de ruído.

CONTAINS e FREETEXT são úteis para diferentes tipos de correspondências, como segue:

  • Use CONTAINS (ou CONTAINSTABLE) para obter correspondências precisas ou difusas (menos precisas) para palavras e frases únicas, a proximidade entre as palavras dentro de uma determinada distância ou correspondências ponderadas. Ao usar CONTAINS, você deve especificar pelo menos um critério de pesquisa que especifique o texto procurado e as condições que determinam correspondências.

    Você pode usar uma operação lógica entre condições de pesquisa. Para obter mais informações, consulte Usando operadores booleanos —AND, OR, AND NOT (em CONTAINS e CONTAINSTABLE), mais adiante neste tópico.

  • Use FREETEXT (ou FREETEXTTABLE) para fazer a correspondência de significado, mas não da frase exata, de palavras, frases ou sentenças especificadas (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.

Para executar consultas em servidores vinculados, você pode usar nomes de quatro partes em CONTAINS ou FREETEXT. Para obter mais informações, consulte Consultando servidores vinculados (pesquisa de texto completo).

Para obter informações sobre a sintaxe e os argumentos desses predicados, consulte CONTAINS (Transact-SQL) e FREETEXT (Transact-SQL).

ObservaçãoObservação

Predicados de texto completo não são permitidos na Cláusula OUTPUT quando o nível de compatibilidade do banco de dados está definido como 100.

Exemplos

A. Usando CONTAINS com <simple_term>

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

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

B. Usando FREETEXT para procurar palavras que contêm valores de caractere especificados

O exemplo a seguir procura todos os documentos que contêm as palavras relacionadas a componentes vitais, de segurança.

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

Visão geral das funções de texto completo (CONTAINSTABLE e FREETEXTTABLE)

As funções CONTAINSTABLE e FREETEXTTABLE são referenciadas como um nome de tabela comum na cláusula FROM de uma instrução SELECT. Elas retornam uma tabela de zero, uma ou mais linhas que correspondem à consulta de texto completo. A tabela retornada contém somente as linhas da tabela base que atendem aos critérios de seleção especificados no critério de pesquisa de texto completo da função.

As consultas que usam uma dessas funções retornam um valor de classificação de relevância (RANK) e uma chave de texto completo (KEY) para cada linha, da seguinte maneira:

  • Coluna KEY

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

  • Coluna RANK

    A coluna RANK retorna um valor de classificação para cada linha que indica o grau de correspondência da linha com os 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. Observe que 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 obter mais informações, consulte Limitando conjuntos de resultados classificados (Pesquisa de Texto Completo) e Como os resultados de consultas de pesquisa são classificados (Pesquisa de Texto Completo).

Ao usar uma dessas funções, você deve especificar a tabela base que deve ser objeto da pesquisa de texto completo. 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 serão usados por uma dada consulta de texto completo.

CONTAINSTABLE é útil para os mesmos tipos de correspondências que CONTAINS, e FREETEXTTABLE é útil para os mesmos tipos de correspondências que FREETEXT. Para obter mais informações, consulte Visão geral dos predicados de texto completo (CONTAINS e FREETEXT), anteriormente neste tópico. Quando executar consultas que usam as funções CONTAINSTABLE e FREETEXTTABLE, você deve unir explicitamente as linhas que são retornadas com as linhas da tabela base do SQL Server.

Para obter mais informações sobre a sintaxe e os argumentos dessas funções, consulte CONTAINSTABLE (Transact-SQL) e FREETEXTTABLE (Transact-SQL).

Exemplos

A. Usando CONTAINSTABLE

O exemplo a seguir retorna a descrição e o nome de todas as categorias de alimentos das quais a coluna Descrição contém as palavras "doce e saboroso" próximo às palavras "molhos" ou "balas". Todas as linhas com um nome de categoria "Frutos do mar" são desconsideradas. Apenas as linhas com valor de classificação 2 ou maior são retornadas.

USE Northwind;
GO
SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

B. Usando FREETEXTTABLE

O exemplo a seguir estende uma consulta FREETEXTTABLE para retornar primeiro as linhas com classificação mais alta e adicionar a classificação de cada linha à lista de seleção. Para especificar a consulta, você deve saber que CategoryID é a coluna da chave exclusiva para a tabela Categorias .

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

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

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Usando operadores booleanos —AND, OR, AND NOT (em CONTAINS e CONTAINSTABLE)

O predicado CONTAINS e a função CONTAINSTABLE usam as mesmas condições de pesquisa. Os dois permitem combinar vários termos de pesquisa usando operadores booleanos — AND, OR, AND NOT — para executar operações lógicas. Você pode usar AND, por exemplo, para localizar linhas que contêm "expresso" e "rosca". Você pode usar AND NOT, por exemplo, para localizar as linhas que contêm "rosca" mas que não contêm "cream cheese".

ObservaçãoObservação

Por outro lado, FREETEXT e FREETEXTTABLE tratam os termos booleanos como palavras a serem pesquisadas.

Para obter mais informações sobre como combinar CONTAINS com outros predicados que usam os operadores lógicos AND, OR e NOT, consulte Critério de pesquisa (Transact-SQL).

Exemplo

O exemplo a seguir usa a tabela ProductDescription do banco de dados AdventureWorks. A consulta usa o predicado CONTAINS para procurar descrições nas quais a ID de descrição não é igual a 5 e a descrição contém as palavras "Aluminum" e "spindle". O critério de pesquisa usa o operador booleano AND.

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

Considerações adicionais

Cada tabela habilitada para texto completo tem uma coluna que é usada para impor linhas exclusivas da tabela (a coluna de chaveexclusiva). Ao gravar consultas de texto completo do tipo CONTAINSTABLE ou FREETEXTTABLE, é necessário saber o nome da coluna de chave exclusiva. Para obter mais informações, consulte Como perguntar sobre a coluna de chave de texto completo (Transact-SQL).

Muitos termos de consulta dependem bastante do comportamento do separador de palavras. Para assegurar que você use o separador de palavras (e lematizador) e o arquivo de dicionário de sinônimos corretos, é recomendável especificar o argumento LANGUAGE. Para obter mais informações, consulte Práticas recomendadas para escolher um idioma ao criar um índice de texto completo.

Ao definir uma consulta de texto completo, o Mecanismo de Texto Completo descarta as palavras irrelevantes (também chamadas de palavras de ruído) dos critérios de pesquisa. Palavras irrelevantes são palavras como "um", "e", "é" ou "o(s)/a(s)", que podem ocorrer com freqüência, mas normalmente não ajudam na pesquisa de um determinado texto. As palavras irrelevantes são relacionadas em uma lista de palavras irrelevantes (stoplist). 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 obter mais informações, consulte Palavras irrelevantes e listas de palavras irrelevantes.

A correspondência com o dicionário de sinônimos ocorre para consultas Transact-SQL CONTAINS e CONTAINSTABLE que especificam a cláusula FORMSOF THESAURUS e para consultas FREETEXTABLE por padrão.