Full-Text Search – CONTAINS – Parte 2

E ai pessoas!

Ando meio sumido, visto que assumi alguns projetos grandes de infraestrutura e desenvolvimento que estão me roubando as poucas horas de descanso que utilizo para escrever no blog.

Mas vamos para a segunda parte do artigo dedicado a função CONTAINS! Como vimos no artigo anterior, para recuperar registros de uma tabela que possuem a palavra “azul” em qualquer posição, podemos utilizar da função CONTAINS:

O problema começa quando o que queremos recuperar são as variações de uma determinada palavra, assim temos o recurso do ‘*’ no caso dos sufixos:

Visto que questões de gênero (masculino/feminino) e grau (singular/plural) ainda não são consideradas, se torna necessário o uso de mais um predicado, FORMSOF(INFLECTIONAL …):

Por fim, podemos juntar as duas soluções em uma só:

Para complicar mais sua vida, surge a necessidade de considerar os sinônimos (ou tesauros http://pt.wikipedia.org/wiki/Tesauro)… Bem, você pode criar uma solução própria com uma tabela que relacione todos os sinônimos, ou utilizar o próprio Full-Text Search nisso.

A solução do Full-Text Search faz uso do predicado FORMSOF(THESAURUS…), mas enquanto não é configurado, não se pode esperar muito:

Cada instância do SQL Server possui seu Full-Text Data (ou simplesmente FTData), que possui uma relação de configurações do Full-Text Search para cada idioma no formato XML. Para encontrar estas configurações, siga o seguinte caminho:

C:\Program Files\Microsoft SQL Server\{Instância do SQL Server}\MSSQL\FTData

Conforme o meu cenário:

Nesta pasta, temos as configurações dos tesauros. Sendo tsglobal.xml utilizado por todos os idiomas, tsptb.xml para o idioma “pt-BR” e tsptg.xml para o idioma “pt”.

Para demonstrar como configurar estes arquivos, segue uma situação onde configurei no arquivo tsglobal.xml que “Azul” e “Azulado” são sinônimos e “AZ” é sigla de “Azul”.

Após configurar os arquivos XML, atualize as linguanges do Full-Text Search e identifique o código da linguagem Global (Neutral) e pt-BR (Brazilian)

Com o código da linguagem (lcid), será possível atualizar as configurações de tesauros do SQL Server, com a stored procedure “sp_fulltext_load_thesaurus_file”:

Por fim, executado o predicado de tesauros com a sigla “AZ” temos como resultado registros com a palavra “azul” e com a palavra “azul” temos os registros que possuem as palavras “azul” e “azulado”:

Full-Text Search é um recurso fantástico! Mas ainda não acabou, escreverei mais artigos sobre as funcionalidade do Full-Text Search, aguardem!

Artigos relacionados:

Full-Text Search – Overview:
https://sqlfromhell.wordpress.com/2011/02/10/full-text-search-overview

Full-Text Search – CONTAINS – Parte 1:
https://sqlfromhell.wordpress.com/2011/02/21/full-text-search-contains

Anúncios

6 pensamentos sobre “Full-Text Search – CONTAINS – Parte 2

  1. Pingback: Full-Text Search – Resumo « SQL From Hell.com

  2. Amigo, boa tarde.
    Estou utilizando o FTs para fazer a seguinte busca: select * from tabela where contains((TIPO1, TIPO2),'(cancer and plasma) not colesterol’)

    Minha tabela tem o seguinte formato com os seguintes dados:

    TIPO1 | TIPO2
    Tumor | Cancer, plasma
    Cancer | Colesterol, infeccao

    Quando eu executo a busca, ele me retorna as duas linhas acima. Ele não deveria me retornar apenas a primeira, pois estou pesquisando no campo 1 e 2 se existe tanto a palavra “cancer” quanto a palavra “plasma”, e que não tenha presente em nenhum dos campos a palavra “colesterol”.

    Estou muito confuso! rs….

    Abraços, e fico no aguardo.

    • Bom dia Thiago, aparentemente sua consulta esta correta, e deveria retornar somente o primeiro registro. Tente deixar a consulta somente com “cancer and plasma”, e veja o resultado.

      • Paulo.

        Aparentemente deveria estar correta né…rs…

        Tentei a seguinte consulta:
        select * from tabela where contains((TIPO, UNIVERSIDADE),’Infeccao AND NOT USP ’)

        Minha tabela tem o seguinte formato com os seguintes dados:

        TIPO | UNIVERSIDADE
        Infeccao | UNICAMP
        Infeccao | USP

        Se busco apenas ‘Infeccao’, ele me traz as duas linhas. Porém, quando busco ‘Infeccao AND NOT USP’, ele também me traz as duas linhas.

        Juro, não sei mais o que fazer….rs…
        Já remontei catalogo, tabela. e nada dela funcionar.

        Abraços, e obrigado pelo retorno.

      • Penso que se você tentar só “NOT USP”, nenhum registro será filtrado (pois é um sigla), então recomendo deixar UNIVERSIDADE fora do CONTAINS.

  3. Paulo, boa tarde!

    No caso acima, seria simples realizar tal pesquisa utilizando apenas o ‘NOT USP’ uma vez que eu sei quais são os valores na tabela.

    Agora, imagine no caso de um usuário que não saiba exatamente quais são os dados presentes na tabela… ele iria realizar a pesquisa pelo o que ele deseja, excluindo o que não gostaria de observar, sendo assim, seria primordial realizar a consulta utilizando todos os operadores descritos.

    Já nem sei mais o que fazer….rs…

    Abraços,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s