2009-02-25 17 views
8

Por lo tanto, necesito averiguar cómo hacer una búsqueda booleana de texto completo en una base de datos MySQL para devolver un registro que contenga el término "C++".¿Cómo se obtiene su búsqueda booleana de texto completo para recoger el término C++?

tengo mi cadena de búsqueda SQL como:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

A pesar de todos mis campos contienen la cadena C++, nunca se devuelve en los resultados de búsqueda.

¿Cómo puedo modificar MySQL para acomodar esto? ¿Es posible?

La única solución que he encontrado sería escapar del carácter + durante el proceso de ingresar mis datos como algo como "__plus" y luego modificar mi búsqueda para acomodar, pero esto parece engorroso y tiene que haber una manera mejor .

+0

¿Qué diablos es una búsqueda booleana de texto completo? Suena terriblemente como si hubieras inventado esa palabra. Además, tu pregunta es muy vaga. Debe proporcionar una mejor descripción de su problema, lo que está tratando de hacer. De lo contrario, no podemos ayudarte. –

+0

@John: Estás siendo muy duro. Tuve que abstenerme de vincularme a lmgtfy, así que aquí hay una explicación de MySQL: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html –

+0

@A. Rex - Soy malvado (en cierto sentido) mi punto de vista es duro pero la pregunta es deficiente en cuanto a cómo harías una buena pregunta. Como tal, nosotros (personas desbordadas de pila) no podemos proporcionar una buena respuesta basada en información insuficiente. –

Respuesta

8

¿Cómo puedo modificar MySQL para acomodar esto?

Tendrás que cambiar la idea de MySQL de lo que es una palabra.

En primer lugar, la longitud mínima de palabra predeterminada es 4. Esto significa que ningún término de búsqueda que contenga solo palabras de < 4 letras alguna vez coincidirá, ya sea 'C++' o 'cpp'. Puede configurar esto usando la opción de configuración ft_min_word_len, por ej. en su my.cfg:

[mysqld] 
ft_min_word_len=3 

(continuación arranque/parada de MYSQLD y reconstruir los índices de texto completo.)

En segundo lugar, ‘+’ no se considera una letra por MySQL. Puede escribir una letra, pero eso significa que no podrá buscar la palabra 'pez' en la cadena 'fish + chips', por lo que se requiere cierto cuidado. Y no es trivial: requiere recompilar MySQL o piratear un juego de caracteres existente. Consulte la sección que comienza con "Si desea cambiar el conjunto de caracteres que se consideran caracteres de palabras ..." en section 11.8.6 del documento.

escapar el carácter + durante el proceso de introducción de los datos de mi como algo parecido a "__plus" y luego modificando mi búsqueda para acomodar

Sí, algo así como que es una solución común: usted puede mantener su datos 'reales' (sin el escape) en una tabla primaria y definitiva, generalmente usando InnoDB para el cumplimiento de ACID. Luego se puede agregar una tabla auxiliar MyISAM, que contiene solo las palabras mutiladas para el cebo de búsqueda de texto completo. También puede hacer una forma limitada de derivación utilizando este enfoque.

Otra posibilidad es detectar búsquedas que MySQL no puede hacer, como las que tienen solo palabras cortas o caracteres inusuales, y recurrir a una búsqueda LIKE o REGEXP simple pero lenta para esas búsquedas solamente. En este caso, probablemente también desee eliminar el archivo bloqueado configurando ft_stopword_file en una cadena vacía, ya que no es práctico recoger todo en eso como especial.

+0

@bobince: (Re la discusión en los comentarios anteriores, gracias por contestar esta pregunta fácilmente comprensible de una manera clara.) Fuera de curiosidad, ¿cómo lo harías derivando con este enfoque? Reemplazar cada palabra en la tabla auxiliar con su raíz? –

+0

Esencialmente sí (procesando las palabras en las consultas de búsqueda de la misma manera, por supuesto). Por lo general, utilizaría una biblioteca de stemmer stripping-stripping existente para sus idiomas preferidos. (Para ambos valores de 'idioma', ver, por ejemplo, el algoritmo de Porter para el inglés en muchos lenguajes de programación). – bobince

0

Los caracteres habitualmente escapados se utilizan en la consulta y no en los datos de la base de datos. Pruebe escapando cada "+" en su consulta.

1

De http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

Una frase que está entre comillas dobles (“"”) caracteres partidos sólo las filas que contienen la frase literalmente, como si se hubiera escrito

Esto le significa. puede buscar 'C++' usando esta consulta:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0

solución ::

cambio my.ini

poner estas dos líneas

ft_min_word_len = "1" 
ft_stopword_file ="" 

continuación

[mysqld] 

de archivo savve y reinicio del servidor MySQL.

my.ini archivo compartido por todos. Entonces, ¿podemos hacer cambios en el archivo my.ini solo para alguna sesión?

Cuestiones relacionadas