php mysql lucene full-text-search sphinx

php - La mejor manera de tratar las faltas de ortografía en una búsqueda de texto completo en MySQL



lucene full-text-search (3)

El término técnico para lo que está buscando es la distancia de Levenshtein que se utiliza para calcular la diferencia entre dos secuencias (en este caso, una secuencia de caracteres que es una cadena).

PHP en realidad tiene dos funciones integradas para eso, la primera es similar_text y la otra llamada levenshtein que debería ayudarlo con su problema. Tendrá que hacer un punto de referencia si es lo suficientemente rápido para sus necesidades.

Tengo alrededor de 2000 filas en una base de datos mysql.

Cada fila tiene un máximo de 300 caracteres y contiene una oración o dos.

Utilizo la búsqueda de texto completo de mysql para buscar estas filas.

Me gustaría agregar una característica para que se corrijan errores tipográficos y errores ortográficos, si es posible.

Por ejemplo, si alguien escribe "derecho" en el cuadro de búsqueda, esto equivaldría a "hombro derecho" al realizar la búsqueda.

¿Cuáles son sus sugerencias sobre la forma más sencilla de agregar este tipo de funcionalidad? ¿Vale la pena agregar un motor de búsqueda externo de algún tipo, como Lucene? (Parece que para un conjunto de datos tan pequeño, esto es una exageración). ¿O hay una forma más simple?

Gracias de antemano por tu ayuda.


MySQL no admite la búsqueda de SOUNDEX en texto completo.

Si desea implementar un marco similar a Lucene, significa que debe tomar todos los documentos, dividirlos en palabras y luego construir un índice para cada palabra.

Cuando alguien busca "derecho", debes hacer una búsqueda SOUNDEX para cada palabra en la tabla de mundos:

$search = ''right shlder''; preg_match_all(''(/w+)'', $search, $matches); if (!empty($matches[0])) $sounds = array_map(''soundex'', $matches[0]); $query = ''SELECT word FROM words_list WHERE SOUNDEX(word) IN(/'''.join(''/',/''',$sounds).''/')'';

y luego hacer una búsqueda de texto completo:

$query2 = ''SELECT * FROM table WHERE MATCH(fultextcolumn) AGAINST (''.join ('' OR '', $resuls).'' IN BINARY MODE)'';

Donde $ resultado es una matriz con los resultados de la primera consulta.


Creo que deberías usar SOUNDS LIKE o SOUNDEX()

Como su conjunto de datos es tan pequeño, una solución puede ser crear una nueva tabla para almacenar las palabras individuales o los valores soundex contenidos en cada campo de texto y usar SONIDOS COMO en esa tabla.

p.ej:

SELECT * FROM table where id IN ( SELECT refid FROM tableofwords WHERE column SOUNDS LIKE ''right'' OR column SOUNDS LIKE ''shlder'' )

consulte: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Creo que no es posible buscar comodín en la cadena :(