Compartilhar via


FREETEXT (Transact-SQL)

É um predicado usado na cláusula WHERE Transact-SQL de uma instrução SELECT Transact-SQL para executar uma pesquisa de texto completo do SQL Server em colunas indexadas de texto completo que contêm tipos de dados baseados em caractere. Esse predicado procura valores correspondentes ao significado e não apenas o teor exato das palavras nos critérios da pesquisa. Quando FREETEXT é usado, o mecanismo de consulta de texto completo executa internamente as ações a seguir em 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 em limites de palavra (quebra de palavras).

  • Gera formas flexivas das palavras (ramificações).

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

Dica

Para obter informações sobre os formulários de pesquisas de texto completo que têm suporte no SQL Server, consulte Consulta com pesquisa de texto completo.

Aplica-se a: SQL Server (do SQL Server 2008 à versão atual).

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

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, text, 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 incluído 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 pesquisas de texto completo devem ser usadas para pesquisar um determinado freetext_string. Se mais de uma tabela estiver na cláusula FROM, * deverá 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 a ser pesquisado na column_name. Qualquer texto, incluindo palavras, frases ou orações, pode ser inserido. Correspondências serão geradas se qualquer termo ou os formulários de qualquer termo forem localizados no índice de texto completo.

    Ao contrário da condição de pesquisa CONTAINS e CONTAINSTABLE, em que AND é uma palavra-chave, quando usada em freetext_string, a palavra 'and' é considerada uma palavra de ruído ou palavra irrelevante e será descartada.

    Não é permitido o uso de WEIGHT, FORMSOF, curingas, NEAR e outra sintaxe. freetext_string é uma palavra quebrada, ramificada e enviada pelo dicionário de sinônimos.

    freetext_string é nvarchar. Uma conversão implícita acontece quando outro tipo de dados de caractere é usado como entrada. No exemplo a seguir, a variável @SearchWord, que está definida como varchar(30), causa uma conversão implícita no predicado FREETEXT.

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

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

    USE AdventureWorks2012;
    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 OPTIMIZE FOR para casos em que um plano não ideal é gerado.

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

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

    Quando especificado como uma cadeia de caracteres, language_term corresponde ao valor da coluna alias na exibição de compatibilidade de sys.syslanguages (Transact-SQL). A cadeia de caracteres deve estar 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 dois bytes), o Microsoft SQL Server o converterá em Unicode.

    Se o idioma especificado não for válido ou se não houver nenhum recurso instalado que corresponda ao idioma, o Microsoft SQL Server retornará um erro. Para usar os recursos com neutralidade de idioma, especifique 0x0 como language_term.

Comentários gerais

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

Consultas de texto completo que usam FREETEXT são menos precisas que 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 nenhuma palavra-chave reservada ou curinga que geralmente tem significado quando especificado no parâmetro <contains_search_condition> do predicado CONTAINS.

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.

Dica

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

Consultando servidores remotos

É possível 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.

Comparação de LIKE com a pesquisa de texto completo

Em comparação com a pesquisa de texto completo, o predicado Transact-SQL LIKE funciona apenas com padrões de caractere. Além disso, não é possível usar o predicado LIKE para consultar dados binários formatados. Além disso, uma consulta LIKE feita em uma grande quantidade de dados de texto não estruturados é bem mais lenta do que uma consulta de texto completo equivalente feita nos mesmos dados. Uma consulta LIKE executada em milhões de linhas de dados de texto pode demorar muitos minutos, enquanto uma consulta de texto completo pode demorar alguns segundos ou menos para ser executada nos mesmos dados, dependendo do número de linhas retornadas.

Exemplos

A.Usando FREETEXT para pesquisar palavras que contêm valores de caracteres especificados

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

USE AdventureWorks2012;
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 AdventureWorks2012;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description 
FROM Production.ProductDescription 
WHERE FREETEXT(Description, @SearchWord);
GO

Consulte também

Tarefas

Criar consultas de pesquisa de texto completo (Visual Database Tools)

Referência

CREATE FULLTEXT CATALOG (Transact-SQL)

CREATE FULLTEXT INDEX (Transact-SQL)

CONTAINS (Transact-SQL)

CONTAINSTABLE (Transact-SQL)

Tipos de dados (Transact-SQL)

FREETEXTTABLE (Transact-SQL)

WHERE (Transact-SQL)

Conceitos

Iniciar a pesquisa de texto completo

Criar e gerenciar catálogos de texto completo

Criar e gerenciar índices de texto completo

Consulta com pesquisa de texto completo