Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
Escreva consultas de texto completo utilizando os predicados CONTAINS e FREETEXT e as funções CONTAINSTABLE e FREETEXTTABLE, com valor de conjunto de linhas, 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
CONTAINSeCONTAINSTABLE. - Para corresponder ao significado, mas não à formulação exata, use
FREETEXTeFREETEXTTABLE.
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 pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
Para executar as consultas de exemplo, é necessário também configurar o motor de pesquisa Full-Text. Para mais informações, consulte Introdução à pesquisa de texto completo.
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 AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO
Exemplo: CONTAINSTABLE
O exemplo seguinte devolve 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 da palavra light ou da 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 seguinte estende uma FREETEXTTABLE consulta para devolver primeiro as linhas mais bem classificadas e para adicionar a classificação de cada linha à lista de seleção. Para escrever uma consulta semelhante, tens de 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
Aqui está uma extensão da mesma consulta que só retorna linhas com uma classificação de 10 ou superior:
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
Combinar palavras ou o significado
CONTAINS e CONTAINSTABLE, ou FREETEXT e FREETEXTTABLE, são úteis para diferentes tipos de correspondência. A informação seguinte ajuda-o a escolher o melhor predicado ou função para a sua consulta:
CONTAINS e CONTAINSTABLE
- 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 mais informações, veja Usar operadores booleanos (AND, OR e NOT) mais adiante neste artigo.
FREETEXT e FREETEXTTABLE
- 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 ou FREETEXT e as funções CONTAINSTABLE ou FREETEXTTABLE com valor de conjunto de linhas têm sintaxe e opções diferentes. A informação seguinte ajuda-o a escolher o melhor predicado ou função para a sua consulta:
Predicados CONTÉM e TEXTO LIVRE
Utilização. Utilize 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 devolvem 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. Pode combinar os predicados com qualquer um dos outros Transact-SQL predicados, 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.
Pode utilizar um nome de quatro partes no predicado CONTAINS ou FREETEXT para consultar colunas indexadas para texto integral nas tabelas de destino de um servidor ligado. 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 destes predicados, veja CONTAINS e FREETEXT.
Funções com valor de conjunto de linhas CONTAINSTABLE e FREETEXTTABLE
Utilização. Utilize as funções de texto completo CONTAINSTABLE e FREETEXTTABLE como o nome de uma tabela normal 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, tens de 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 texto completo, é usada para impor linhas únicas para a tabela (a coluna chave única). Para mais informações sobre a coluna-chave, consulte Criar e gerir índices em texto completo.
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.
Consultas que utilizam uma destas funções também retornam um valor de classificação de relevância (RANK) e uma chave de texto completo (KEY) para cada linha devolvida, da seguinte forma:
KEYcoluna. AKEYcoluna devolve valores únicos das linhas devolvidas. AKEYcoluna pode ser usada para especificar critérios de seleção.RANKcoluna. ARANKcoluna devolve um valor de classificação para cada linha que indica quão bem a linha correspondia 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 mais informações, consulte Limitar resultados de pesquisa com classificação.
Para mais informações sobre a sintaxe e os argumentos destas funções, veja CONTAINSTABLE e FREETEXTTABLE.
Tipos específicos de pesquisas
Procure por uma palavra ou frase específica (termo simples)
Pode usar CONTAINS, CONTAINSTABLE, FREETEXT, , ou FREETEXTTABLE pesquisar numa tabela por uma palavra ou frase específica. Por exemplo, se quiser pesquisar na ProductReview tabela da AdventureWorks2025 base de dados para encontrar todos os comentários sobre um produto com a frase learning curve, 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 pesquisa, neste caso learning curve, pode ser complexa e pode ser composta por um ou mais termos.
Mais informações sobre pesquisas de termos simples
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é au lait é uma frase. Palavras e expressões como estas são chamadas de termos simples.
CONTAINS e CONTAINSTABLE procura uma correspondência exata para a expressão.
FREETEXT e FREETEXTTABLE divide a frase em palavras separadas.
Procure uma palavra com prefixo (termo prefixo)
Pode usar CONTAINS ou CONTAINSTABLE procurar palavras ou expressões 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 procurar todas as linhas que contêm o prefixo top-, como em topple, topping, e top, a consulta assemelha-se ao seguinte exemplo:
USE AdventureWorks2025;
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 em CONTAINS (DESCRIPTION, 'top*'), a pesquisa em texto completo não considera o asterisco como um coringa.
Quando o termo prefixo é uma frase, cada token que compõe a frase é considerado um termo de prefixo separado. Todas as linhas que tenham palavras a começar pelos termos prefixos são devolvidas. Por exemplo, o termo de prefixo light bread* encontra linhas com texto de light breaded, lightly breaded ou light bread, mas não devolve lightly toasted bread.
Mais informações sobre pesquisas por 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 prefixo, qualquer palavra que comece com o termo especificado faz parte do conjunto de resultados. Por exemplo, o termo
auto*corresponde aautomatic,automobilee assim por diante.Para uma frase, cada palavra dentro da frase é considerada um termo prefixo. Por exemplo, o termo
auto tran*corresponde aautomatic transmissioneautomobile transducer, mas não corresponde aautomatic motor transmission.
As pesquisas por prefixos são suportadas por CONTAINS e CONTAINSTABLE.
Procure formas flexionais de uma palavra específica (termo geracional)
Pode usar CONTAINS, CONTAINSTABLE, FREETEXT, ou FREETEXTTABLE procurar todos os diferentes tempos verbais e conjugações de um verbo ou tanto as formas singular como plural de um substantivo (uma pesquisa flexional) ou formas sinónimas de uma palavra específica (uma pesquisa de dicionário de sinónimos).
O exemplo seguinte procura qualquer forma de foot (foot, feet e assim sucessivamente) na coluna Comments da tabela ProductReview da base de dados AdventureWorks2025:
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 os diferentes tempos e conjugações de um verbo, bem como as formas singulares e plurais de um substantivo. Para mais informações sobre stemmers, consulte Configurar e gerir word breakers e stemmers.
Mais informações sobre pesquisas de termos geracionais
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 drive. Se várias linhas na tabela incluírem as palavras drive, drives, drove, driving e driven, todas estariam no conjunto de resultados, porque cada uma delas pode ser gerada por flexão a partir da palavra drive.
FREETEXT e FREETEXTTABLE procuram formas flexionadas de todas as palavras especificadas por defeito.
CONTAINS 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 ficheiros de tesauro, consulte Configurar e Gerir Ficheiros de Tesauro para Pesquisa de Texto Integral.
Por exemplo, se uma entrada , {car, automobile, truck, van}for adicionada a um dicionário de sinónimos, pode procurar a forma do 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 destas palavras pertence ao conjunto de expansão sinónimo que contém a palavra car.
FREETEXT e FREETEXTTABLE usam o dicionário de sinónimos por defeito.
CONTAINS e CONTAINSTABLE suportam um argumento opcional THESAURUS.
Procure 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, quer encontrar as linhas em que a palavra ice está perto da palavra hockey ou em que a frase ice skating está perto da frase ice hockey.
Para mais informações sobre pesquisas de proximidade, consulte Procurar palavras próximas de outra palavra com NEAR.
Procure palavras ou expressões usando valores ponderados (termo ponderado)
Podes usar CONTAINSTABLE para pesquisar palavras ou expressões e especificar um valor de peso. 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 seguinte mostra uma consulta que pesquisa todos os endereços de clientes, usando pesos, na qual qualquer texto que comece pela cadeia Bay tenha Street ou View. Os resultados atribuem uma classificação mais alta às 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 em conjunto com qualquer termo simples, prefixo, termo de geração ou termo de proximidade.
Mais informações sobre pesquisas de termos ponderadas
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 são considerados mais relevantes do que outros devido à variação nos valores ponderados associados a diferentes termos pesquisados.
As pesquisas de termos ponderadas são suportadas por CONTAINSTABLE.
Usar E, OU e NÃO (operadores booleanos)
O predicado CONTAINS e a função CONTAINSTABLE utilizam 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 realizar operações lógicas. Pode usar AND, por exemplo, para encontrar linhas que contenham tanto latte como New York-style bagel. 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 tratar os termos booleanos como palavras a serem pesquisadas.
Para obter informações sobre a combinação de CONTAINS com outros predicados que utilizam os operadores lógicos AND, OR e NOT, consulte Condição de pesquisa.
Exemplo
O exemplo seguinte usa o CONTAINS predicado para procurar descrições em que o ID da descrição não é igual a 5 e a descrição contém tanto a palavra Aluminum como a palavra spindle. A condição de pesquisa utiliza o AND operador booleano. Este exemplo utiliza a ProductDescription tabela da AdventureWorks2025 base de dados.
USE AdventureWorks2025;
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. Quando defines uma consulta em texto completo, o Full-Text Engine descarta palavras de parada (também chamadas palavras de ruído) dos critérios de pesquisa. Palavras de parada são palavras como
a,and,is, outhe, que podem ocorrer frequentemente, mas que normalmente não ajudam na procura de um texto específico. 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 mais informações, consulte Configurar e gerir palavras irrelevantes e listas de palavras irrelevantes na Full-Text Search.Idioma, com a opção
LANGUAGE. Muitos termos de consulta dependem muito do comportamento do separador de palavras. Para garantir que está a usar o separador de palavras correto (e o radicalizador) e o ficheiro de tesauro corretos, deve especificar a opçãoLANGUAGE. Para mais informações, consulte Escolher uma língua ao criar um índice em texto completo.Thesaurus.
FREETEXTeFREETEXTTABLEconsultas usam o dicionário de sinônimos por predefinição.CONTAINSeCONTAINSTABLEsuportam um argumento opcionalTHESAURUS. Para obter mais informações, consulte Configurar e gerir ficheiros de dicionário de sinónimos para a pesquisa Full-Text.
Verifique os resultados da tokenização
Depois de aplicar uma determinada combinação de separador de palavras, tesauro e lista de palavras ignoradas numa consulta, pode ver como a Pesquisa de Texto Integral tokeniza os resultados ao utilizar a vista de gestão dinâmica sys.dm_fts_parser. Para mais informações, consulte sys.dm_fts_parser.