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