Introdução a freetext e contains em SQL-Server

O que são e como é a sintaxe, para construir catálogos de dados em SQL-Server.

Por Claudio


Publicado em: 14/1/08

Valorize este artigo:
FULL TEXT SEARCH

Utiliza-se em campos de texto de grande tamanho utilizando uns índices denominados catálogos. Estes catálogos só se podem utilizar com tabelas que contenham que definidas chaves primárias e armazenam todas as palavras do conteúdo das tabelas com execeção dos artigos, preposições, etc.

Os catálogos não se atualizam automaticamente nem se salvam junto com o banco de dados e cada tabela pode ter um único catálogo.

Para a utilização destes catálogos dentro de uma consulta, podemos utilizar dois métodos, o primeiro consiste em incluir os critérios dentro de uma cláusula WHERE (CONTAINS ou FREETEXT) e o segundo é utilizando uma tabela temporária que contém o ratio de acerto na consulta (CONTAINSTABLE ou FREETEXTTABLE).

O predicado CONTAINS

Utiliza-se este predicado para buscar um texto específico em uma tabela. Seu funcionamento é similar ao predicado LIKE, a diferença é que este não pode realizar buscas nos campos grandes de texto. CONTAINS não diferencia entre maiúsculas e minúsculas.

Sintaxe:

SELECT <Campos> FROM <Tabela>
WHERE CONTAINS(<Campo>,<Cadeia>) OR/AND CONTAINS(<Campo>,<Cadeia>)


O predicado CONTAINS suporta sintaxe complexas para buscar:

  • Uma ou mais palavras utilizando os operadores lógicos AND/OR.
  • Famílias de palavras
  • Uma palavra ou uma frase que comecem por um determinado texto.
  • Palavras ou frases que estejam umas próximas de outras.

Para buscar uma palavra em um campo:

SELECT title_id, title, notes FROM titles
WHERE CONTAINS(notes,'business')


Para localizar uma frase em um campo:

SELECT title_id, titles, notes FROM titles
WHERE CONTAINS(notes,' "common business applications" ')


Para localizar uma frase em todos os campos habilitados:

SELECT title_id, titles, notes FROM titles
WHERE CONTAINS(*, ' "common business applications" ')


Utilizando AND, OR e NOT

SELECT title, notes FROM titles
WHERE CONTAINS(notes, ' "favorite recipes" OR "gourmet recipes" ')

SELECT titles, notes FROM titles
WHERE CONTAINS(notes, ' cooking AND NOT ("computer*") ')

SELECT titles, notes FROM titles
WHERE CONTAINS(notes, ' beer AND ales ')

SELECT titles, notes FROM titles
WHERE CONTAINS(*, '("ice skating" OR hockey) AND NOT olympics')

Utilizando caracteres curingas

SELECT titles, notes FROM titles
WHERE CONTAINS(notes,' "ice*" ')

SELECT titles, notes FROM titles
WHERE CONTAINS(notes, ' "light bread*" ')

Busca de palavras ou frases indicando a importância das palavras:

Esta busca permite indicar o peso que terá cada uma das palavras ou frases que se buscam sobre o resultado da busca, o peso oscila entre o valor mais baixo 0.0 e o valor mais alto 1.0.

SELECT Cliente, Nome, Endereco FROM Cliente
WHERE CONTAINS (Endereco, 'ISABOUT ( "Rua*", Velazquez WEIGHT(0.5), Serrano(0.9)')

(Serão encontrados todos aqueles registros que no campo endereço exista a cadeia rua seguida de qualquer valor, ordenando primeiro os de "Rua Serrano", logo os de "Rua Velázquez" e depois o resto.

Busca de palavras próximas:

Podemos realizar buscas por duas palavras e indicar que se encontrem próximas uma da outra. A ordem das palavras não altera o resultado da busca.

SELECT titulo, notas FROM livros
WHERE CONTAINS (notas, "usuario NEAR computador")

SELECT titulo, notas FROM livros
WHERE CONTAINS (notas, "usuario ~ computador")


Podem-se indicar três palavras, de tal forma que a segunda e a primeira devem estar próximas ao igual que a segunda e a terceira.

SELECT titulo, notas FROM livros
WHERE CONTAINS (notas, "usuario ~ principiante ~ computador")


Buscas com frases:

... WHERE CONTAINS(Descricao, " salsas ~ "mezcl*" ")

... WHERE CONTAINS(Descricao, " "carne*" ~ "salsa empanada*" ")


O predicado FREETEXT

Ao utilizar este predicado se analisam todas as palavras das frases e nos devolve como resultado, aqueles registros que contém a frase completa ou algum fragmento da mesma. A sintaxe é igual que o predicado CONTAINS.

... FREETEXT(descricao, ' "Em um lugar da mancha de cujo nome não quero me lembrar" ')

O predicado CONTAINSTABLE

Este predicado tem igual funcionamento e sintaxe que CONTAINS a diferença que neste caso devolve uma tabela com duas colunas, a primeira chamada [KEY] contem o valor da chave primária da tabela que a que buscamos, a segunda chamada RANK devolve um valor indicando a porcentagem de acerto na busca para cada registro.

SELECT Perguntas.Pergunta, Perguntas.Resposta, Resultado.RANK
FROM Perguntas, CONTAINSTABLE(Resposta, " SQL Server") AS Resultado
WHERE Perguntas.IdPergunta = Resultado.[KEY]
ORDER BY Resultado.RANK Desc

SELECT Perguntas.Pergunta, Perguntas.Resposta, Resultado.RANK
FROM Perguntas INNER JOIN CONTAINSTABLE (Resposta, "SQL Server") AS Resultado
ON Perguntas.IdPergunta = Resultados.KEY


O predicado FREETEXTTABLE

É o equivalente a CONTAINSTABLE porém realizando buscas de FREETEXT.





Comentários do artigo
Foi enviado 1 comentário ao artigo
1 comentário não revisado
0 comentários revisados

Usuários :    login / registro
Manuais relacionados
Categorias relacionadas
O autor

Buscar projetos:

Home | Sobre nós | Copyright | Anuncie | Entrar em contato