Buenas.

Tengo un problema con una base de datos PostgreSQL con codificación UNICODE
que da soporte a una aplicación en PHP.

Todo funcionaba correctamente hasta que me pidieron que una búsqueda de por
ejemplo "Martin" debería devolver los registros "Martin" y también los
"Martín".

¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no
distinta entre "Martin" y "martin".

No me preocupaba hasta que me dí cuenta de que MySQL con codificación
utf8_general lo hace sin problemas. ¿Hay alguna solución para esto?

--
"Comparte lo que sabes, aprende lo que no sepas"
Todo por el conocimiento libre

Linux user number 441469

Me gustaría cambiar el mundo, pero no tengo el código fuente !

Me limito a dejar mi granito de arena en http://blog.josemanuelruizbaena.com

Search Discussions

  • Alvaro Herrera at Sep 21, 2010 at 4:45 pm

    Excerpts from José Manuel Ruiz's message of mar sep 21 11:59:59 -0400 2010:
    Buenas.

    Tengo un problema con una base de datos PostgreSQL con codificación UNICODE
    que da soporte a una aplicación en PHP.

    Todo funcionaba correctamente hasta que me pidieron que una búsqueda de por
    ejemplo "Martin" debería devolver los registros "Martin" y también los
    "Martín".

    ¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no
    distinta entre "Martin" y "martin".
    puedes usar el contrib unaccent; solo en 9.0 si mal no recuerdo.

    o puedes usar la funcion to_ascii que reduce un texto de esta manera.
    Creo que solo funciona en latin1 eso si, asi que debes convertir desde
    utf8 a latin1 usando la funcion convert o convert_to.

    no recuerdo los detalles exactos.


    otra opcion es usar una funcion para quitar acentos que esta en el wiki.


    --
    Álvaro Herrera <alvherre@commandprompt.com>
    The PostgreSQL Company - Command Prompt, Inc.
    PostgreSQL Replication, Consulting, Custom Development, 24x7 support
  • Román Mussi at Sep 21, 2010 at 7:45 pm
    Hola,
    Escribí algo en mi blog que por ahí te resulta útil. Te paso el link,
    http://romanmussi.blogspot.com/2009/12/busquedas-por-campos-de-texto-en.html
    Saludos
    Román
    ----- Original Message -----
    From: José Manuel Ruiz
    To: pgsql-es-ayuda@postgresql.org
    Sent: Tuesday, September 21, 2010 12:59 PM
    Subject: [pgsql-es-ayuda] Búsqueda de palabras con Acentos


    Buenas.


    Tengo un problema con una base de datos PostgreSQL con codificación UNICODE que da soporte a una aplicación en PHP.


    Todo funcionaba correctamente hasta que me pidieron que una búsqueda de por ejemplo "Martin" debería devolver los registros "Martin" y también los "Martín".


    ¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no distinta entre "Martin" y "martin".


    No me preocupaba hasta que me dí cuenta de que MySQL con codificación utf8_general lo hace sin problemas. ¿Hay alguna solución para esto?

    --
    "Comparte lo que sabes, aprende lo que no sepas"
    Todo por el conocimiento libre

    Linux user number 441469

    Me gustaría cambiar el mundo, pero no tengo el código fuente !

    Me limito a dejar mi granito de arena en http://blog.josemanuelruizbaena.com
  • Alvaro Herrera at Sep 22, 2010 at 8:06 pm
    Francamente yo me ahorarría todo esto y vería cómo usar FTS ...

    --
    Álvaro Herrera <alvherre@commandprompt.com>
    The PostgreSQL Company - Command Prompt, Inc.
    PostgreSQL Replication, Consulting, Custom Development, 24x7 support
  • Horacio Miranda at Sep 23, 2010 at 12:01 am
    soundex ?

    http://www.postgresonline.com/journal/archives/158-Where-is-soundex-and-other-warm-and-fuzzy-string-things.html


    2010/9/23 Alvaro Herrera <alvherre@commandprompt.com>:
    Francamente yo me ahorarría todo esto y vería cómo usar FTS ...

    --
    Álvaro Herrera <alvherre@commandprompt.com>
    The PostgreSQL Company - Command Prompt, Inc.
    PostgreSQL Replication, Consulting, Custom Development, 24x7 support
    -
    Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
    Para cambiar tu suscripción:
    http://www.postgresql.org/mailpref/pgsql-es-ayuda


    --
    Saludos,
    Horacio Miranda Aguilera.
  • José Manuel Ruiz at Sep 22, 2010 at 6:37 am
    Muchas gracias, añadiré tu blog para seguir aprendiendo.

    La función:

    *CREATE OR REPLACE FUNCTION sp_ascii(character varying)**
    **RETURNS text AS**
    **$BODY$**
    **SELECT TRANSLATE
    ($1,
    'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',**
    **'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');**
    **$BODY$**
    **LANGUAGE 'sql';*

    Hace justo lo que pretendía.

    SELECT * FROM nombres WHERE sp_ascii(apellido1) ILIKE sp_ascii('martin');

    Ahora me devuelve, los Martin, martin, Mártin, Martín, MARTÍN...

    Pero aún así esto hará que modifique la aplicación para que las peticiones
    de datos sean correctas. ¿Se os ocurre alguna forma de mejorar esto?

    Yo estoy pensando en hacer vistas sobre las tablas haciendo la conversión a
    SIN ACENTOS de todas las columnas, pero aún así tendría que modificar mi
    aplicación para que busque en v_nombres en lugar de en la tabla nombres.

    Alguna idea mejor para no tener que modificar la aplicación.

    Gracias por la ayuda.

    El 21 de septiembre de 2010 21:38, Román Mussi
    <romanmussi@nitrico.com.ar>escribió:
    Hola,
    Escribí algo en mi blog que por ahí te resulta útil. Te paso el link,

    http://romanmussi.blogspot.com/2009/12/busquedas-por-campos-de-texto-en.html
    Saludos
    Román

    ----- Original Message -----
    *From:* José Manuel Ruiz <josemanuelruizbaena@gmail.com>
    *To:* pgsql-es-ayuda@postgresql.org
    *Sent:* Tuesday, September 21, 2010 12:59 PM
    *Subject:* [pgsql-es-ayuda] Búsqueda de palabras con Acentos

    Buenas.

    Tengo un problema con una base de datos PostgreSQL con codificación UNICODE
    que da soporte a una aplicación en PHP.

    Todo funcionaba correctamente hasta que me pidieron que una búsqueda de por
    ejemplo "Martin" debería devolver los registros "Martin" y también los
    "Martín".

    ¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no
    distinta entre "Martin" y "martin".

    No me preocupaba hasta que me dí cuenta de que MySQL con codificación
    utf8_general lo hace sin problemas. ¿Hay alguna solución para esto?

    --
    "Comparte lo que sabes, aprende lo que no sepas"
    Todo por el conocimiento libre

    Linux user number 441469

    Me gustaría cambiar el mundo, pero no tengo el código fuente !

    Me limito a dejar mi granito de arena en
    http://blog.josemanuelruizbaena.com

    --
    "Comparte lo que sabes, aprende lo que no sepas"
    Todo por el conocimiento libre

    Linux user number 441469

    Me gustaría cambiar el mundo, pero no tengo el código fuente !

    Me limito a dejar mi granito de arena en http://blog.josemanuelruizbaena.com
  • Miguel Panuera at Sep 22, 2010 at 1:31 pm
    Buenas, al realizar estas funciones,
    tambien se deberia crear un indice con la funcion para optimizar la
    busqueda????????

    El 22 de septiembre de 2010 01:37, José Manuel Ruiz <
    josemanuelruizbaena@gmail.com> escribió:
    Muchas gracias, añadiré tu blog para seguir aprendiendo.

    La función:

    *CREATE OR REPLACE FUNCTION sp_ascii(character varying)**
    **RETURNS text AS**
    **$BODY$**
    **SELECT TRANSLATE
    ($1,
    'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',**
    **'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');**
    **$BODY$**
    **LANGUAGE 'sql';*

    Hace justo lo que pretendía.

    SELECT * FROM nombres WHERE sp_ascii(apellido1) ILIKE sp_ascii('martin');

    Ahora me devuelve, los Martin, martin, Mártin, Martín, MARTÍN...

    Pero aún así esto hará que modifique la aplicación para que las peticiones
    de datos sean correctas. ¿Se os ocurre alguna forma de mejorar esto?

    Yo estoy pensando en hacer vistas sobre las tablas haciendo la conversión a
    SIN ACENTOS de todas las columnas, pero aún así tendría que modificar mi
    aplicación para que busque en v_nombres en lugar de en la tabla nombres.

    Alguna idea mejor para no tener que modificar la aplicación.

    Gracias por la ayuda.

    El 21 de septiembre de 2010 21:38, Román Mussi <romanmussi@nitrico.com.ar>escribió:
    Hola,
    Escribí algo en mi blog que por ahí te resulta útil. Te paso el link,

    http://romanmussi.blogspot.com/2009/12/busquedas-por-campos-de-texto-en.html
    Saludos
    Román

    ----- Original Message -----
    *From:* José Manuel Ruiz <josemanuelruizbaena@gmail.com>
    *To:* pgsql-es-ayuda@postgresql.org
    *Sent:* Tuesday, September 21, 2010 12:59 PM
    *Subject:* [pgsql-es-ayuda] Búsqueda de palabras con Acentos

    Buenas.

    Tengo un problema con una base de datos PostgreSQL con codificación
    UNICODE que da soporte a una aplicación en PHP.

    Todo funcionaba correctamente hasta que me pidieron que una búsqueda de
    por ejemplo "Martin" debería devolver los registros "Martin" y también los
    "Martín".

    ¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no
    distinta entre "Martin" y "martin".

    No me preocupaba hasta que me dí cuenta de que MySQL con codificación
    utf8_general lo hace sin problemas. ¿Hay alguna solución para esto?

    --
    "Comparte lo que sabes, aprende lo que no sepas"
    Todo por el conocimiento libre

    Linux user number 441469

    Me gustaría cambiar el mundo, pero no tengo el código fuente !

    Me limito a dejar mi granito de arena en
    http://blog.josemanuelruizbaena.com

    --
    "Comparte lo que sabes, aprende lo que no sepas"
    Todo por el conocimiento libre

    Linux user number 441469

    Me gustaría cambiar el mundo, pero no tengo el código fuente !

    Me limito a dejar mi granito de arena en
    http://blog.josemanuelruizbaena.com


    --
    Miguel Panuera,
    Student of the School of Computer Science,
    San Pablo Catholic University, Arequipa, Peru,
    mpanuera[AT]gmail.com
  • Jaime Casanova at Sep 22, 2010 at 6:30 pm

    2010/9/22 Miguel Panuera <mpanuera@gmail.com>:
    Buenas, al realizar estas funciones,
    tambien se deberia crear un indice con la funcion para optimizar la
    busqueda????????
    En este caso no, porque esta usando ILIKE y ese operador nunca usa
    indices ademas la funcion sp_ascii esta siendo declarada volatile,
    pero si haces esto:

    CREATE OR REPLACE FUNCTION sp_ascii(character varying)
    RETURNS text AS
    $BODY$
    SELECT TRANSLATE
    ($1,
    'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',
    'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');
    $BODY$
    LANGUAGE 'sql' IMMUTABLE;

    (no veo problema en declarar la funcion IMMUTABLE, o la hay?)

    CREATE INDEX idx_ascii_apellido ON nombres (lower(sp_ascii(apellido1)));

    SELECT * FROM nombres WHERE lower(sp_ascii(apellido1)) LIKE
    lower(sp_ascii('martin'));


    deberia funcionar

    --
    Jaime Casanova         www.2ndQuadrant.com
    Soporte y capacitación de PostgreSQL
  • Gunnar Wolf at Sep 23, 2010 at 6:56 pm

    José Manuel Ruiz dijo [Tue, Sep 21, 2010 at 05:59:59PM +0200]:
    Buenas.

    Tengo un problema con una base de datos PostgreSQL con codificación UNICODE
    que da soporte a una aplicación en PHP.

    Todo funcionaba correctamente hasta que me pidieron que una búsqueda de por
    ejemplo "Martin" debería devolver los registros "Martin" y también los
    "Martín".

    ¿Cómo puedo solucionar esto? Ya utilizo ilike en lugar de like para que no
    distinta entre "Martin" y "martin".

    No me preocupaba hasta que me dí cuenta de que MySQL con codificación
    utf8_general lo hace sin problemas. ¿Hay alguna solución para esto?
    Ummm... Creo que -en líneas generales- estás buscando una solución
    demasiado angosta ;-)

    Si vas a hacer búsquedas sobre texto completo, y si quieres que además
    estas búsquedas identifiquen palabras relacionadas (como Martin por
    Martín, o como "educativo" por "educar"), puedes hacer tus búsquedas
    usando TSearch2. Esto implica que manejes un trigger al crear o
    modificar tus datos. Pero las ganancias bien valen la pena:

    Carga primero las definiciones de tsearch2 - en mi caso (Debian, para
    la DB 'test'):

    $ psql test < /usr/share/postgresql/9.0/contrib/tsearch2.sql

    Y ya desde psql

    test=# select set_curcfg('spanish');
    set_curcfg
    ------------

    (1 row)

    test=# CREATE TABLE blah (id serial, datos text, datos_vect tsvector);
    NOTICE: CREATE TABLE will create implicit sequence "blah_id_seq" for
    serial column "blah.id"
    CREATE TABLE
    test=# CREATE INDEX blah_idx ON blah USING gist(datos_vect);
    CREATE INDEX
    test=# CREATE TRIGGER vect_update BEFORE UPDATE OR INSERT ON blah FOR
    EACH ROW EXECUTE PROCEDURE tsearch2(datos_vect, datos);
    CREATE TRIGGER

    Le aventamos algunos datos:

    test=# INSERT INTO blah (datos) VALUES ('Martín martillaba educativos educadamente');
    INSERT 0 1
    test=# INSERT INTO blah (datos) VALUES ('¿Qué es lo que dices que Martin Martillaba?');
    INSERT 0 1
    test=# INSERT INTO blah (datos) VALUES ('Claramente he dicho que Martín martillaba educativos educadamente');
    INSERT 0 1
    test=# INSERT INTO blah (datos) VALUES ('Tu enunciado carece de educación. O por lo menos, carece de consistencia interna. Es incomprensible.');
    INSERT 0 1
    test=# INSERT INTO blah (datos) VALUES ('Entonces no hablamos de Martin, sino que de mi!');
    INSERT 0 1

    Y hacemos una consulta simple (con la sintaxis adecuada para
    TSearch2):

    test=# SELECT id, datos from blah where datos_vect @@ to_tsquery('Martín');
    id | datos
    ----+-------------------------------------------------------------------
    1 | Martín martillaba educativos educadamente
    2 | ¿Qué es lo que dices que Martin Martillaba?
    3 | Claramente he dicho que Martín martillaba educativos educadamente
    5 | Entonces no hablamos de Martín, sino que de mi!
    (4 rows)
    id | datos
    ----+------------------------------------------------------------------------------------------------------
    1 | Martín martillaba educativos educadamente
    3 | Claramente he dicho que Martín martillaba educativos educadamente
    4 | Tu enunciado carece de educación. O por lo menos, carece de consistencia interna. Es incomprensible.
    (3 rows)


    Bueno, y basta de trucos de mago. ¿Cómo ocurre esto en verdad? Veamos
    qué es lo que en realidad estoy preguntando:

    test=# select to_tsquery('Educar'), to_tsquery('Martín');
    to_tsquery | to_tsquery
    ------------+------------
    'educ' | 'martin'
    (1 row)

    ¿Y cómo están guardados los datos para responder a esta solicitud?

    test=# select datos_vect from blah;
    datos_vect
    --------------------------------------------------------------------------------------
    'educ':3,4 'martill':2 'martin':1
    'dic':5 'martill':8 'martin':7
    'clar':1 'dich':3 'educ':7,8 'martill':6 'martin':5
    'carec':3,10 'consistent':12 'educ':5 'enunci':2 'incomprens':15 'intern':13 'men':9
    'entonc':1 'habl':3 'martin':5 'sin':6
    (5 rows)


    Espero que te sea más útil que simplemente botar acentos ;-)
  • P valdes at Sep 26, 2010 at 5:25 pm
    Select bla-bla-bla from tablablabla where campo is like 'Mart%' o algo así ...
  • P valdes at Sep 26, 2010 at 5:27 pm
    he añadido un IS de mas, efectivamente, en realidad es

    select X from Tabla where X LIKE 'Mart%';

    En resúmen, busca en el manual el uso de LIKE y SIMILAR
  • Gunnar Wolf at Sep 29, 2010 at 4:23 pm

    p valdes dijo [Sun, Sep 26, 2010 at 07:27:44PM +0200]:
    he añadido un IS de mas, efectivamente, en realidad es

    select X from Tabla where X LIKE 'Mart%';

    En resúmen, busca en el manual el uso de LIKE y SIMILAR
    Claro, eso se puede si conoces la palabra exacta que vas a buscar,
    pero si estás trabajando con entrada directa del usuario, te conviene
    ser tan amplio como puedas. En este caso, TSearch2 va a encontrar
    mucho más (y mejores) coincidencias.

    ¡Ah, claro! Y mucho más eficiente. Cuando buscas con LIKE o SIMILAR
    TO sobre un campo de texto, es prácticamente inevitable que termines
    haciendo búsquedas secuenciales sobre _todos_ tus
    registros. Obviamente, cuando tienes un cuerpo de datos
    suficientmente amplio, esto se vuelve prohibitivo. TSearch2 indexa
    sobre las (partículas de las) palabras individuales.
  • \(Syswarp\) Carlos Enrique Perez at Sep 29, 2010 at 5:57 pm
    Mirate esto:
    http://romanmussi.blogspot.com/2009/12/busquedas-por-campos-de-texto-en.html



    -----Mensaje original-----
    De: pgsql-es-ayuda-owner@postgresql.org
    En nombre de Gunnar Wolf
    Enviado el: miércoles, 29 de septiembre de 2010 13:24
    Para: p valdes
    CC: pgsql-es-ayuda@postgresql.org
    Asunto: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Búsqueda de palabras con
    Acentos

    p valdes dijo [Sun, Sep 26, 2010 at 07:27:44PM +0200]:
    he añadido un IS de mas, efectivamente, en realidad es

    select X from Tabla where X LIKE 'Mart%';

    En resúmen, busca en el manual el uso de LIKE y SIMILAR
    Claro, eso se puede si conoces la palabra exacta que vas a buscar, pero si
    estás trabajando con entrada directa del usuario, te conviene ser tan amplio
    como puedas. En este caso, TSearch2 va a encontrar mucho más (y mejores)
    coincidencias.

    ¡Ah, claro! Y mucho más eficiente. Cuando buscas con LIKE o SIMILAR TO sobre
    un campo de texto, es prácticamente inevitable que termines haciendo
    búsquedas secuenciales sobre _todos_ tus registros. Obviamente, cuando
    tienes un cuerpo de datos suficientmente amplio, esto se vuelve prohibitivo.
    TSearch2 indexa sobre las (partículas de las) palabras individuales.
    -
    Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
    Para cambiar tu suscripcin:
    http://www.postgresql.org/mailpref/pgsql-es-ayuda

    __________ Information from ESET NOD32 Antivirus, version of virus signature
    database 5489 (20100929) __________

    The message was checked by ESET NOD32 Antivirus.

    http://www.eset.com
  • Guillermo Villanueva at Sep 29, 2010 at 6:22 pm
    Jaja, dio tantas vueltas este tema que terminamos respondiendo lo mismo que
    en el 2do post.
    Saludos

    ~~~~~~~~~~~~~~~~
    Guillermo Villanueva


    El 29 de septiembre de 2010 14:57, (Syswarp) Carlos Enrique Perez <
    carlos.perez@syswarp.com.ar> escribió:

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppgsql-es-ayuda @
categoriespostgresql
postedSep 21, '10 at 4:00p
activeSep 29, '10 at 6:22p
posts14
users10
websitepostgresql.org.es
irc#postgresql

People

Translate

site design / logo © 2022 Grokbase