2012-03-27 37 views
5

tengo una tabla como estaMySQL búsqueda de texto completo plural/singular de las palabras

CREATE TABLE jobs(
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    title VARCHAR(200), 
    body TEXT, 
    FULLTEXT (title,body) 
) ENGINE=MyISAM; 

Y dos registros en esta tabla

... 
7. 10 Senior PHP Developers (Leaders) 
8. 30 PHP Developers.. 
... 

Y dos consultas:

  1. Devuelve 2 registros por encima de

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developers')

  2. Volver conjunto vacío

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer')

pensé que MySQL puede encontrado estos registros con 'desarrollador'. ¿Pero por qué no funcionó?

Respuesta

4

Puede cambiar a texto completo con los operadores booleanos: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

y la búsqueda de:

SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer*' IN BOOLEAN MODE) 

Usted obtendrá resultados para 'desarrollador' primero, y luego 'desarrolladores' o cualquier cadena que comienza con 'desarrollador'. Está bien para palabras largas y precisas como 'desarrollador', pero buscar 'coche *' por ejemplo podría conducir a muchos resultados inesperados como 'tarjeta', 'cardamon', ...

No creo que haya análisis gramatical en la búsqueda de texto completo de MySQL. En realidad estaba investigando este tema hoy y no he encontrado nada mejor.

EDITAR

Este método no funcionará para las palabras tales como 'partido' (en plural: 'partes'). Si su formulario de búsqueda está limitado al inglés, creo que puede cubrir la mayoría de los casos con algunas reglas gramaticales simples, y para cada palabra, busque la palabra y su plural. Y está mal, probablemente lleve a una palabra inválida, que debería ser neutral en su búsqueda.

+0

gracias, supongo que no hay una despalilladora en el interior del motor de búsqueda de texto completo de MySQL. Intento entender y encontrar la mejor solución para MySQL, no para este caso especial ^^. – hungneox

3
select * from index_table where item_name rlike '[[:<:]]preform[s]*[es]*[ies]*[[:>:]]'; 

Compruebe si esto ayuda. Mi caso funcionó. Aunque no cubre todos los plurales, sí para 90-95% de casos.

Saludos, Ashish

Cuestiones relacionadas