The most effective way to restrict democracy is to transfer decision making from the public arena to unaccountable institutions. Chomsky.

Full text search engine

2008-10-10 14:51:17-05

Desarrollo

Si de por si desde hace años PostgreSQL es una base de datos superior a MySQL, pero con las nuevas características de la versión 8.3 hay todavía más razones para profundizar en esta hermana pequeña de Oracle.

Una de las cosas más esperadas es el Full Text Search Engine (FTSE), que es con lo que estoy jugando. Aún no lo entiendo del todo pero al parecer la cosa está asi, existen dos funciones to_tsvector() y to_tsquery() que convierten los datos de la tabla en "lexemas" de búsqueda, sólo los lexemas válidos entran el FTSE.

Primero hay que inicializar un diccionario para nuestro idioma dentro de psql de nuestra DB:

CREATE TEXT SEARCH DICTIONARY karamelo_es (
   template = snowball,
   language = spanish,
   stopwords = spanish
);

CREATE TEXT SEARCH CONFIGURATION public.karamelo_es ( COPY = pg_catalog.spanish );

Sin esto el buscador no encuentra cosas en español pues los lexemas no están dados de alta.  Ahora ya podemos buscar, por ejemplo tengo una tabla "news" con los campos id, title, body y created y voy a buscar todos los rows donde aparezca el término "Educación" en el campo body:

SELECT news.id, news.title FROM news WHERE to_tsvector('karamelo_es', body) @@ to_tsquery('karamelo_es','Educación') ORDER BY created DESC LIMIT 20;

Lo mejor es crear un índice de lexemas castellanos en esta tabla para acelerar la búsqueda:

CREATE INDEX pgnews_idx ON news USING gin(to_tsvector('karamelo_es', body));

Pero eso no es todo, con la nueva función ts_rank_cd de PostgreSQL 8.3 puedo hacer un ranking automático para que las noticias donde más aparece el término se listen primero:

SELECT id, title, ts_rank_cd(to_tsvector('karamelo_es', body), to_tsquery('karamelo_es','Educación | sexualidad')) AS rank FROM news, to_tsquery('karamelo_es','Educación | sexualidad') query WHERE to_tsquery('karamelo_es','Educación | sexualidad') @@ to_tsvector('karamelo_es', body) ORDER BY rank DESC LIMIT 20;

que me regresa los rows:

 id |                                    title                                     |                         rank
----+------------------------------------------------------------------------------+------
  8 | La educación sexual debe iniciar desde preescolar: UNESCO      |  0.4
 15 | SEP: sanción a quien use libro del GDF de educación sexual           |  0.3
  9 | Las cuotas escolares son necesarias: SEJ                                     |  0.1
 10 | Informa SEP estatus de planteles que perdieron registro               |  0.1
 11 | Ofrece Michoacán educación a distancia a inmigrantes en EU        |  0.1
 13 | Un rompecabezas, el sistema educativo nacional, diagnóstico de especialistas |  0.1
(6 rows)

En este último ejemplo estoy buscando dos términos "educación" y "sexualidad", sólo los separo con un pipe (|), obviamente en PHP el query se haría con variables que definirían los términos y el idioma de los términos. En el FTSE mayúsculas o minúsculas no importan.

Pero eso no es todo, postgresql puede resaltar las palabras en la búsqueda luego de encontrar los campos con la función ts_headline:

SELECT id, title, ts_headline('karamelo_es', body, to_tsquery('karamelo_es','Educación | sexualidad')), rank FROM ( SELECT id, title, substr(body,0,160) as body, ts_rank_cd(to_tsvector('karamelo_es', body), to_tsquery('karamelo_es','Educación | sexualidad')) AS rank FROM news, to_tsquery('karamelo_es','Educación | sexualidad') query WHERE to_tsquery('karamelo_es','Educación | sexualidad') @@ to_tsvector('karamelo_es', body) ORDER BY rank DESC LIMIT 20 ) AS foo;

De este modo al ver los resultados el usuario ve exactamente donde se encuentran los términos que buscó.

Por si esto fuera poco la velocidad de PostgreSQL 8.3 se incrementó perronamente:

POstgresql 

Conclusión: PostgreSQL rulez!!

 

Permalink: http://www.mononeurona.org/users/entry/aarkerio/1588


Comments Comentblogs:
1.- asarch asarch wrote:

!?

2008-10-12 11:25:48-05

New Comentblog

Captcha



Login



Remember me:
aarkerio
Manuel Montoya estudió neuropsicología en la facultad y en el Instituto de Biomédicas de la UNAM. Trabajó en Compaq de México como diseñador de software, tiene diez años de experiencia en Java, Python, PHP y SQL. Le interesan muchas cosas y neciamente le da por escribir sobre todas ellas.

Actualmente trabaja en Chipotle Software, desarrollando Karamelo, una herramienta de e-Learning. Emacs y WindowMaker son su editor y escritorio favoritos.
GNU W3C anarquismo cakephp centauro ciencia cine cooperación cooperativa hacking historia humor internet karamelo linux literatura méxico música netbsd política programación psicología recetas sociedad software libre arte
Powered by:
Despabilando la MonoNeurona.org
Livechat

<-Nombre
aarkerio wrote:
Fixed!
on 23/10/08

marcos_d wrote:
Los temas en el rss de la Mononeurona no se actualizan
on 14/8/08

diablomx wrote:
aarkerio me URGE URGE hablar contigo...hablame a mi cel.
on 13/6/08

mayralorena wrote:
que gane Meeexico!!!!
on 8/6/08

s1m0 wrote:
Thot dice que se apunta para los de melon(Aunque yo te dije piñon :)' ) solo hay que ponernos de acuerdo....
on 14/5/08

aarkerio wrote:
En Tehuacán nos vemos, en el tapanco
on 10/5/08

s1m0 wrote:
Ps tu dices cuando, brindamos con la bebida de los dioses!!!
on 30/4/08

Karla wrote:
saludos guapo!
on 7/3/08

aarkerio wrote:
No, sólo que hagas cut&paste
on 28/2/08

dmesg wrote:
aarkerio, crees que puede haber la posibilidad de en mi blog de mononeurona se puedan ver los post que he puesto en mononeurona?
on 21/2/08

¿Qué estuve haciendo?
Portando Karamelo a Windows, guacala!
3 days, 2 hours ago
Chido! thx asarch
3 days, 19 hours ago
Cómo se crea una imagen linux.img para Qemu?
3 days, 21 hours ago
Aprendiendo Mercurial
1 week, 3 days ago
Me voy a hacer in licuado de plátano
1 week, 5 days ago
Mejor un caballito d' limón y dos de tequila, el Aderogyl mexicano!
1 week, 6 days ago
toy enfermo, inche gripe
2 weeks ago
Basic? wacala! enseñales Python
2 weeks, 3 days ago
I an in IRC channel
2 weeks, 3 days ago
inche red inalámbrica de de la unam, está del nabo
2 weeks, 4 days ago
Galerias
aarkerio's Forums
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2008.