Partilhar via


TEXTO LIVRE (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azurebanco de dados SQL no Microsoft Fabric

É um predicado usado na cláusula Transact-SQL WHERE de uma instrução Transact-SQL SELECT para executar uma pesquisa de texto completo do SQL Server em colunas indexadas de texto completo contendo tipos de dados baseados em caracteres. Este predicado procura valores que correspondam ao significado e não apenas à redação exata das palavras na condição de pesquisa. Quando FREETEXT é usado, o mecanismo de consulta de texto completo executa internamente as seguintes ações no freetext_string, atribui um peso a cada termo e, em seguida, localiza as correspondências:

  • Separa a cadeia de caracteres em palavras individuais com base nos limites das palavras (quebra de palavras).

  • Gera formas flexionais das palavras (derivação).

  • Identifica uma lista de expansões ou substituições para os termos com base em correspondências no dicionário de sinônimos.

Observação

Para obter informações sobre as formas de pesquisas de texto completo suportadas pelo SQL Server, consulte Consulta com Full-Textde Pesquisa .

Aplica-se a: SQL Server (SQL Server 2008 (10.0.x) até versão atual).

Transact-SQL convenções de sintaxe

Sintaxe

FREETEXT ( { column_name | (column_list) | * }   
          , 'freetext_string' [ , LANGUAGE language_term ] )  

Argumentos

column_name
É o nome de uma ou mais colunas indexadas de texto completo da tabela especificada na cláusula FROM. As colunas podem ser do tipo char, varchar, nchar, nvarchar, texto, ntext, image, xml, varbinary, ou varbinary(max).

column_list
Indica que várias colunas, separadas por uma vírgula, podem ser especificadas. column_list deve ser colocado entre parênteses. A menos que language_term seja especificado, o idioma de todas as colunas de column_list deve ser o mesmo.

*
Especifica que todas as colunas que foram registradas para pesquisa de texto completo devem ser usadas para pesquisar o freetext_stringfornecido. Se mais de uma tabela estiver na cláusula FROM, * deve ser qualificado pelo nome da tabela. A menos que language_term seja especificado, o idioma de todas as colunas da tabela deve ser o mesmo.

freetext_string
É texto para procurar no column_name. Qualquer texto, incluindo palavras, frases ou frases, pode ser inserido. As correspondências são geradas se qualquer termo ou as formas de qualquer termo forem encontradas no índice de texto completo.

Ao contrário da condição de pesquisa CONTÉM e CONTÉM, onde AND é uma palavra-chave, quando usada em freetext_string a palavra 'e' é considerada uma palavra de ruído, ou palavra parada, e será descartada.

Não é permitido o uso de WEIGHT, FORMSOF, curingas, NEAR e outras sintaxes. freetext_string é quebrado de palavras, estancado e passado através do tesauro.

freetext_string é nvarchar. Uma conversão implícita ocorre quando outro tipo de dados de caractere é usado como entrada. Os tipos de dados de cadeia de caracteres grandes nvarchar(max) e varchar(max) não podem ser usados. No exemplo a seguir, a variável @SearchWord, que é definida como varchar(30), causa uma conversão implícita no predicado FREETEXT.

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord VARCHAR(30)  
SET @SearchWord ='performance'  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
  

Como a "deteção de parâmetros" não funciona na conversão, use nvarchar para obter um melhor desempenho. No exemplo, declare @SearchWord como nvarchar(30).

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord NVARCHAR(30)  
SET @SearchWord = N'performance'  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
  

Você também pode usar a dica de consulta OTIMIZE FOR para casos em que um plano não ideal é gerado.

LÍNGUA language_term
É a linguagem cujos recursos serão usados para quebra de palavras, derivação e dicionário de sinônimos e remoção de palavras paradas como parte da consulta. Esse parâmetro é opcional e pode ser especificado como uma cadeia de caracteres, inteiro ou valor hexadecimal correspondente ao identificador de localidade (LCID) de um idioma. Se language_term for especificado, o idioma que ele representa será aplicado a todos os elementos da condição de pesquisa. Se nenhum valor for especificado, o idioma de texto completo da coluna será usado.

Se documentos de idiomas diferentes forem armazenados juntos como objetos binários grandes (BLOBs) em uma única coluna, o identificador de localidade (LCID) de um determinado documento determinará qual idioma será usado para indexar seu conteúdo. Ao consultar essa coluna, especificar LANGUAGE language_term pode aumentar a probabilidade de uma boa correspondência.

Quando especificado como uma cadeia de caracteres, language_term corresponde ao alias de valor da coluna no modo de exibição de compatibilidade sys.syslanguages . A cadeia de caracteres deve ser colocada entre aspas simples, como em 'language_term'. Quando especificado como um inteiro, language_term é o LCID real que identifica o idioma. Quando especificado como um valor hexadecimal, language_term é 0x seguido pelo valor hexadecimal do LCID. O valor hexadecimal não deve exceder oito dígitos, incluindo zeros à esquerda.

Se o valor estiver no formato DBCS (conjunto de caracteres de byte duplo), o Microsoft SQL Server o converterá em Unicode.

Se o idioma especificado não for válido ou se não houver recursos instalados que correspondam a esse idioma, o Microsoft SQL Server retornará um erro. Para usar os recursos de linguagem neutra, especifique 0x0 como language_term.

Observações gerais

Predicados e funções de texto completo funcionam em uma única tabela, o que está implícito no predicado FROM. Para pesquisar em várias tabelas, use uma tabela unida na cláusula FROM para pesquisar um conjunto de resultados que seja o produto de duas ou mais tabelas.

As consultas de texto completo que usam FREETEXT são menos precisas do que as consultas de texto completo que usam CONTAINS. O mecanismo de pesquisa de texto completo do SQL Server identifica palavras e frases importantes. Nenhum significado especial é dado a qualquer uma das palavras-chave reservadas ou caracteres curinga que normalmente têm significado quando especificado no parâmetro <contains_search_condition> do predicado CONTÉM.

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

Observação

A função FREETEXTTABLE é útil para os mesmos tipos de correspondências que o predicado FREETEXT. Você pode fazer referência a essa função como um nome de tabela regular na cláusula FROM de uma instrução SELECT. Para obter mais informações, consulte FREETEXTTABLE (Transact-SQL).

Consultando servidores remotos

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.

Em contraste com a pesquisa de texto completo, o predicado LIKETransact-SQL funciona apenas em padrões de caracteres. Além disso, você não pode usar o predicado LIKE para consultar dados binários formatados. Além disso, uma consulta LIKE em relação a uma grande quantidade de dados de texto não estruturados é muito mais lenta do que uma consulta de texto completo equivalente em relação aos mesmos dados. Uma consulta LIKE em milhões de linhas de dados de texto pode levar minutos para ser retornada; enquanto uma consulta de texto completo pode levar apenas segundos ou menos nos mesmos dados, dependendo do número de linhas retornadas.

Exemplos

Um. Usando FREETEXT para procurar palavras que contenham valores de caracteres especificados

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

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

B. Usando FREETEXT com variáveis

O exemplo a seguir usa uma variável em vez de um termo de pesquisa específico.

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord NVARCHAR(30);  
SET @SearchWord = N'high-performance';  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
GO  

Ver também

Introdução ao de Pesquisa Full-Text
Criar e gerenciar catálogos Full-Text
CRIAR CATÁLOGO DE TEXTO COMPLETO (Transact-SQL)
CRIAR ÍNDICE DE TEXTO COMPLETO (Transact-SQL)
Criar e gerenciar Full-Text índices
Consulta com de Pesquisa Full-Text
Criar consultas de pesquisa Full-Text (Visual Database Tools)
CONTÉM (Transact-SQL)
CONTESTAR (Transact-SQL)
Tipos de dados (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
ONDE (Transact-SQL)