Partilhar via


FREETEXT (Transact-SQL)

É um predicado usado em uma cláusula WHERE para pesquisar valores em colunas que contêm tipos de dados baseados em caracteres que correspondem ao significado e não apenas à redação exata das palavras na condição 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, depois, encontra as correspondências.

  • Separa a cadeia de caracteres em palavras individuais com base em limites de palavra (quebrando 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.

Ícone de vínculo de tópicoConvenções de 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 estar 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.

    O uso de WEIGHT, FORMSOF, curingas, NEAR e outra sintaxe não é permitido. freetext_string é uma palavra quebrada, ramificada, e submetida ao dicionário de sinônimos.

    freetext_string é nvarchar. Uma conversão implícita ocorre 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 AdventureWorks2008R2;
    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 AdventureWorks2008R2;
    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 é gerado um plano não ideal.

  • 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 LANGUAGElanguage_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 de idioma neutros, especifique 0x0 como language_term.

Comentários

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 quaisquer das palavras chave reservadas ou curingas que tipicamente têm significado, quando especificado no parâmetro < contains_search_condition > do predicado de CONTAINS.

FREETEXT não será reconhecido como uma palavra-chave se o nível de compatibilidade for menor que 70. Para obter mais informações, consulte sp_dbcmptlevel (Transact-SQL).

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

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 pode levar 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

O exemplo a seguir pesquisa todos os documentos que contêm as palavras relacionadas a "vital", "safety" e "components".

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