Gmail Calendar Documents Reader Web more »
Recently Visited Groups | Help | Sign in
Google Groups Home
Comparação de strings no Banco sem considerar acentos
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  14 messages - Collapse all  -  Translate all to Translated (View all originals)
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Diego Martins  
View profile   Translate to Translated (View Original)
 More options Nov 28 2008, 7:27 pm
From: "Diego Martins" <conc...@gmail.com>
Date: Fri, 28 Nov 2008 22:27:26 -0200
Local: Fri, Nov 28 2008 7:27 pm
Subject: Comparação de strings no Banco sem considerar acentos

Ola pessoal,

Eu estou com aquele velho problema: Preciso fazer uma busca no banco por
'jose' e tenho que obter como resposta os registros que tiverem o valor
'jose' e 'josé' (com acento).

Eu dei uma boa procurada hoje e não achei nenhuma solução atrelada ao ORM do
Django. Tudo que eu encontrei foram algumas funções internas do banco de
dados que convertem o conteúdo do campo pra ascii removendo assim os acentos
(testei no postgres e tem um comportamento muito estranho por sinal ...).
Bom, não tenho uma estratégia em mente pra resolver esse problema. To
cansado, tomara que eu esteja viajando e a solução esteja debaixo do meu
nariz :D

Minhas indagações são:

 * O Django tem suporte a comparação de strings no banco independentemente
de acentos?
 * Se não, qual seria a maneira ideal de eu contornar esse problema?

Valeu
--
Diego Martins


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Danilo Faustinoni Cabello  
View profile   Translate to Translated (View Original)
 More options Nov 28 2008, 9:26 pm
From: "Danilo Faustinoni Cabello" <danilo.cabe...@gmail.com>
Date: Sat, 29 Nov 2008 00:26:57 -0200
Local: Fri, Nov 28 2008 9:26 pm
Subject: Re: [django-brasil] Comparação de strings no Banco sem considerar acentos
não sei desse recurso no django mas esse recurso em função SQL é
chamada de SOUNDEX [1] já usei em MySQL muito legal.

[1] - http://www.wwwcoder.com/main/parentid/191/site/2189/68/default.aspx

2008/11/28 Diego Martins <conc...@gmail.com>:


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Luciano Ramalho  
View profile   Translate to Translated (View Original)
(1 user)  More options Nov 29 2008, 4:00 am
From: "Luciano Ramalho" <luci...@ramalho.org>
Date: Sat, 29 Nov 2008 07:00:38 -0200
Local: Sat, Nov 29 2008 4:00 am
Subject: Re: [django-brasil] Comparação de strings no Banco sem considerar acentos
2008/11/28 Diego Martins <conc...@gmail.com>:

O Django não tem como suportar este tipo de comparação sem que o banco
de dados implemente, concorda? Se esta comparação ignorando acentos
não for feita pelo próprio mecanismo de indexação do banco de dados,
ela será muito ineficiente para qualquer coleção razoavelmente grande
de documentos.

>  * Se não, qual seria a maneira ideal de eu contornar esse problema?

O que eu tenho feito é criar campos alternativos sem acentos, que eu
preencho automaticamente. Por exemplo:

class Livro(models.Model):
    titulo = models.CharField(u'título', max_length=256)
    titulo_busca = models.CharField(max_length=256, editable=False)

Aí eu preencho o titulo_busca automaticamente usando um método save no
model, conforme esta dica do James Bennett:

http://www.b-list.org/weblog/2006/nov/02/django-tips-auto-populated-f...

E no método save eu uso este truque para transformar a string
acentuada em uma sem acentos:

http://www.pythonbrasil.com.br/moin.cgi/RemovedorDeAcentos

Feito isso, quando alguém faz uma busca por título, eu removo os
acentos da string a ser buscada e pesquiso no campo titulo_busca.

É assim que eu tenho feito. Não é a coisa mais simples e elegante do
mundo, mas pelo menos é 100% independente do banco de dados e tem a
melhor performance possível pois nenhuma conversão é feita nos textos
durante a busca (exceto a conversão da string a ser buscada, que é uma
só).

[ ]s
Luciano


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Danilo Faustinoni Cabello  
View profile   Translate to Translated (View Original)
(1 user)  More options Nov 29 2008, 10:17 am
From: "Danilo Faustinoni Cabello" <danilo.cabe...@gmail.com>
Date: Sat, 29 Nov 2008 12:17:26 -0300
Local: Sat, Nov 29 2008 10:17 am
Subject: Re: [django-brasil] Comparação de strings no Banco sem considerar acentos
2008/11/28 Danilo Faustinoni Cabello <danilo.cabe...@gmail.com>:
> não sei desse recurso no django mas esse recurso em função SQL é
> chamada de SOUNDEX [1] já usei em MySQL muito legal.

> [1] - http://www.wwwcoder.com/main/parentid/191/site/2189/68/default.aspx

acrescentando:

tinha um ticket no django pedindo pelo suporte [1]
a função soundex é comum a vários banco de dados, segue abaixo:
postgresql [2]
mysql [3]
sqlite [4]
oracle [5]

[1] - http://code.djangoproject.com/ticket/8553
[2] - http://www.postgresql.org/docs/8.3/static/fuzzystrmatch.html
[3] - http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function...
[4] - http://www.sqlite.org/lang_corefunc.html
[5] - http://www.techonthenet.com/oracle/functions/soundex.php


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Túlio Paiva  
View profile   Translate to Translated (View Original)
 More options Nov 30 2008, 2:23 pm
From: "Túlio Paiva" <paivatu...@gmail.com>
Date: Sun, 30 Nov 2008 16:23:04 -0300
Local: Sun, Nov 30 2008 2:23 pm
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos
Olá!

Ramalho, muito boa essa sua dica! :) Vai me ser muito útil para usar
no widget autocomplete.

Para facilitar, criei um "SearchField". Acho que pode ser útil:

==SearchField ==

def to_ascii(txt, codif='utf-8'):
    """"Adaptada de
http://www.pythonbrasil.com.br/moin.cgi/RemovedorDeAcentos"""
    if not isinstance(txt, basestring):
        txt = unicode(txt)
    if isinstance(txt, unicode):
        txt = txt.encode('utf-8')
    return normalize('NFKD', txt.decode(codif)).encode('ASCII','ignore')

class SearchField(models.CharField):

    def pre_save(self, model_instance, add):
        search_text = []
        for field_name in self.field_names:
            val = unicode(to_ascii(getattr(model_instance, field_name)))
            search_text.append(val)
        value = u''.join(search_text)
        setattr(model_instance, self.name, value)
        return value

    def __init__(self, field_names, *args, **kwargs):
        self.field_names = field_names
        kwargs.setdefault('max_length', 1024)
        kwargs['editable'] = False
        super(self.__class__, self).__init__(*args, **kwargs)

== Exemplo de uso ==

class Teste(models.Model):
    texto = models.TextField()
    texto_search = SearchField(field_names=['texto'])

Ele recebe como argumento "fields", aí é só escolher quais campos você
quer que ele tire os acentos e armazene.

[]'s

--
Túlio de Paiva
paivatu...@gmail.com


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Luciano Ramalho  
View profile   Translate to Translated (View Original)
 More options Nov 30 2008, 2:38 pm
From: "Luciano Ramalho" <luci...@ramalho.org>
Date: Sun, 30 Nov 2008 17:38:27 -0200
Local: Sun, Nov 30 2008 2:38 pm
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos
2008/11/30 Túlio Paiva <paivatu...@gmail.com>:

Muito legal, Tulio, vou adotar o seu código. É uma solução parecida
com o índice SearchableText do Plone.

Só uma coisa, no método pré-save você colocou:

        value = u''.join(search_text)

Tem que ser:

        value = u' '.join(search_text) # note o espaço entre as aspas

Do contrário você cai concatenar palavras de campos diferentes e
armazenar palavras que não existem, o que poderia gerar resultados
esquisitos na busca.

[ ]s
Luciano


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Túlio Paiva  
View profile   Translate to Translated (View Original)
 More options Nov 30 2008, 2:44 pm
From: "Túlio Paiva" <paivatu...@gmail.com>
Date: Sun, 30 Nov 2008 16:44:03 -0300
Local: Sun, Nov 30 2008 2:44 pm
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos
2008/11/30 Luciano Ramalho <luci...@ramalho.org>:

Que bom que o código foi útil! :)

> Só uma coisa, no método pré-save você colocou:

>        value = u''.join(search_text)

> Tem que ser:

>        value = u' '.join(search_text) # note o espaço entre as aspas

> Do contrário você cai concatenar palavras de campos diferentes e
> armazenar palavras que não existem, o que poderia gerar resultados
> esquisitos na busca.

É verdade! Como acabei de escrever o código e não testei com vários
campos, não tinha me atentado para isso. :P

> [ ]s
> Luciano

[]'s

--
Túlio de Paiva
paivatu...@gmail.com


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Vinicius Mendes  
View profile   Translate to Translated (View Original)
 More options Nov 30 2008, 8:56 pm
From: "Vinicius Mendes" <vbmen...@gmail.com>
Date: Sun, 30 Nov 2008 22:56:22 -0300
Local: Sun, Nov 30 2008 8:56 pm
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos

Muito bom o código... Vou usar nos meus projetos também, já que o PostgreSQL
não ajuda muito nesse ponto...

--------

Vinícius Mendes
Engenheiro de Computação
Meio Código - A peça que faltava para o seu código!
URL http://www.meiocodigo.com

2008/11/30 Túlio Paiva <paivatu...@gmail.com>


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Diego Martins  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 8:08 am
From: "Diego Martins" <conc...@gmail.com>
Date: Mon, 1 Dec 2008 11:08:52 -0200
Local: Mon, Dec 1 2008 8:08 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos

2008/11/29 Luciano Ramalho <luci...@ramalho.org>

> >  * O Django tem suporte a comparação de strings no banco
> independentemente
> > de acentos?

> O Django não tem como suportar este tipo de comparação sem que o banco
> de dados implemente, concorda? Se esta comparação ignorando acentos
> não for feita pelo próprio mecanismo de indexação do banco de dados,
> ela será muito ineficiente para qualquer coleção razoavelmente grande
> de documentos.

Com certeza!

Excelente dica Luciano ... Acho que vou adotar essa solução!! Brigadão.

Mas ... como o Danilo falou se todos os bancos que os Django suporta tem
metodos para realizar essa operação acho que faria sentido o Django
disponibilizar um suporte para essas operações sim.

Abraço


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Luciano Ramalho  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 8:53 am
From: "Luciano Ramalho" <luci...@ramalho.org>
Date: Mon, 1 Dec 2008 11:53:31 -0200
Local: Mon, Dec 1 2008 8:53 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos
2008/12/1 Diego Martins <conc...@gmail.com>:

> Excelente dica Luciano ... Acho que vou adotar essa solução!! Brigadão.

> Mas ... como o Danilo falou se todos os bancos que os Django suporta tem
> metodos para realizar essa operação acho que faria sentido o Django
> disponibilizar um suporte para essas operações sim.

Concordo que seria legal o Django incorporar se todos os bancos que
ele suporta permitem esse tipo de operação (mas não sei se isso
acontece hoje; lembrando que um dos bancos é o SQLite, que eu acho
ótimo que seja suportado oficialmente, mas é mais limitado que o
MySQL, o PostgreSQL e o Oracle).

Acho que juntando a receita do removedor de acentos com a dica do
Túlio Paiva de criar um novo field nós ficamos com uma solução muito
elegante e eficiente, e ainda fazemos algo que seria mais difícil
resolver de forma independente do banco, que é a possibilidade de
fazer a busca em vários campos de uma vez só.

Valeu, Túlio, foi legal colaborar com você!

E grato pela pergunta original, Diego, pois é como se diz: "A
necessidade é a mãe da invenção."

[ ]s
Luciano


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Túlio Paiva  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 11:12 am
From: "Túlio Paiva" <paivatu...@gmail.com>
Date: Mon, 1 Dec 2008 13:12:47 -0300
Local: Mon, Dec 1 2008 11:12 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos
Olá!

Acabei de inaugurar o meu blog e postar o SearchField:
http://paivatulio.wordpress.com/.
Além do que foi discutido aqui, também mostrei lá como integrar com o
site de administração do Django.

Luciano, muito obrigado por sua dica e ajuda.

[]'s

2008/12/1 Luciano Ramalho <luci...@ramalho.org>:

Grato também, Diego :)

> [ ]s
> Luciano

--
Túlio de Paiva
paivatu...@gmail.com

    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Vinicius Mendes  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 11:48 am
From: "Vinicius Mendes" <vbmen...@gmail.com>
Date: Mon, 1 Dec 2008 14:48:27 -0200
Local: Mon, Dec 1 2008 11:48 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos

Eu tenho uma idéia que talvez possa ajudar. Seria algo do tipo:

def pre_save(self, model_instance, add):
       search_text = []
       for field_name in self.field_names:
           val = unicode(to_ascii(getattr(model_instance, field_name)))
           search_text.append(*field_name+':"'+*val*+'"'*)
       value = u''.join(search_text)
       setattr(model_instance, self.name, value)
       return value

Isso faria com que o armazenado no banco fosse algo do tipo:
nome_do_campo:"valor_do_campo"
Isso seria bom se o campo de busca tivesse o valor de mais de um campo, aí o
usuário poderia definir em qual campo utilizar usando essa sintaxe ou então
sem precisar especificar o nome do campo...

2008/12/1 Túlio Paiva <paivatu...@gmail.com>


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rodrigo Pinheiro Matias  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 11:50 am
From: "Rodrigo Pinheiro Matias" <rodrigopmat...@gmail.com>
Date: Mon, 1 Dec 2008 13:50:57 -0300
Local: Mon, Dec 1 2008 11:50 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos

Vinicius acho que vc foi muito infeliz na sua colocação, poderia ter criado
vários flamers, estude um pouco mais antes de criticar o trabalho de outros
grupos esta é uma boa dica até de vida.

2008/11/30 Vinicius Mendes <vbmen...@gmail.com>

--
Rodrigo Pinheiro Matias
Bacharel em Ciência da Computação

Celular
+55 (063) 9237.3480

Telefone em horário Comercial
+55 (063) 3221.2344


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Vinicius Mendes  
View profile   Translate to Translated (View Original)
 More options Dec 1 2008, 11:56 am
From: "Vinicius Mendes" <vbmen...@gmail.com>
Date: Mon, 1 Dec 2008 14:56:53 -0200
Local: Mon, Dec 1 2008 11:56 am
Subject: Re: [django-brasil] Re: Comparação de strings no Banco sem considerar acentos

Não entendi o que você quis dizer amigo, sinceramente. Eu não critiquei o
trabalho de ninguém, eu apenas dei uma sugestão que eu acho uma boa prática.

Mas se ofendi a você, ou a qualquer outra pessoa, peço desculpas. Essa não
foi e nunca será minha intenção. Estou aqui para ajudar e ser ajudado.

Vinícius Mendes
Engenheiro de Computação
Meio Código - A peça que faltava para o seu código!
URL http://www.meiocodigo.com

2008/12/1 Rodrigo Pinheiro Matias <rodrigopmat...@gmail.com>


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
End of messages
« Back to Discussions « Newer topic     Older topic »

Create a group - Google Groups - Google Home - Terms of Service - Privacy Policy
©2009 Google