2012-10-01 17 views
9

Estoy creando una búsqueda para un sitio que utiliza una búsqueda de texto completo. La búsqueda en sí funciona muy bien, ese no es mi problema. Enlazo las palabras clave proporcionadas por el usuario (MATCH ... EN CONTRA ...) con AND para que las palabras múltiples reduzcan aún más los resultados. Ahora, sé que ciertas palabras intermedias no están indexadas, y eso está bien conmigo. Realmente no quiero usarlas como criterios de selección. Pero, si se proporciona una palabra de advertencia en el conjunto de palabras clave (por el usuario), mata todos los resultados (como se esperaba), incluso si la palabra realmente está en un cierto bloque de texto.ignorando las palabras vacías de texto completo de mysql en la consulta

Mi pregunta: ¿hay alguna manera de comprobar si una determinada palabra es una palabra de tope en el momento de la consulta? Mi solución preferida sería simplemente excluir la palabra relevante de los criterios de búsqueda (no me importa si un usuario puede restringir los resultados con la palabra "ninguno", simplemente no quiero que MySQL devuelva un conjunto de resultados vacío porque el usuario siempre y cuando no exista en los resultados). O, ¿voy a tener que vaciar la lista de palabras prohibidas? Muchas gracias por la ayuda.

editar ---- Lo siento, pero realmente no hay fragmentos de código para proporcionar para este. El código funciona bien, en realidad exactamente como se esperaba. Es más un problema lógico con el que estoy tratando. Sino como un ejemplo, en el modo de explicación:

digamos que hay tres registros, que incluyen las palabras (pero no se limitan a)

1: manzana, naranja, mango, plátano 2: Uva , naranja, piña, mango 3: patata, mango, melón, keira knightly

Si la palabra de búsqueda introducida por el usuario es mango, todos los resultados se devuelven correctamente. Si las palabras son naranja Y mango, los resultados 1 y 2 se devuelven (correctamente). Ahora, digamos que banana es una palabra final (no lo es ... pero supongamos que sí), si la búsqueda es naranja, mango y plátano, no se devuelven resultados (porque banana no está en el índice de texto completo).

Lo que estoy buscando es si alguien más ha encontrado este problema, y ​​tiene una forma de evitarlo. Una especie de:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code). 

O ... ¿Soy sólo va a tener que soltar la lista de palabras de parada ...

+0

¿qué intentó? ¿Puedes darnos un ejemplo? – jcho360

+0

Parece que ninguna de las respuestas realmente obtuvo lo que estaba buscando. Siempre puede escribir el código de la aplicación para filtrar manualmente las palabras vacías (así como las palabras demasiado cortas) de su consulta. Eso es probablemente lo que haremos. –

+0

2017 y el mismo problema aquí .. Parece que la búsqueda de texto completo de mysql es realmente pobre y carece de características básicas. – jgr

Respuesta

9

Usted puede verificar las palabras clave comparando todas las palabras vacías. Aquí está la lista de stopwords He encontrado una solución para desactivar las palabras vacías del texto completo. Sólo tiene que localizar .cnf archivo y añadir esto, el motor MySQL

ft_stopword_file = "" 

reiniciar y volver a generar índices;

esperanza este trabajo

+0

Estaba pensando que esta podría ser la ruta que debería seguir. Realmente estaba esperando que alguien más tuviera una solución más inteligente. Gracias por tu contribución. – dgeare

+0

Me alegro, funciona para usted :) –

3

Cómo desactivar las palabras vacías de texto completo en MySQL:

En archivo de texto my.ini (MySQL):

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

// conjunto de su longitud mínima, pero tenga en cuenta que las palabras más cortas (3,2) aumentarán dramáticamente el tiempo de consulta, especialmente si los campos de la columna con índice completo son grandes.

Guarde el archivo, reinicie el servidor.

El siguiente paso debe ser para reparar los índices con esta consulta:

REPAIR TABLE tbl_name QUICK. 

Sin embargo, esto no funcionará si la tabla está utilizando motor de almacenamiento InnoDB. Usted tendrá que cambiar a MyISAM:

ALTER TABLE t1 ENGINE = MyISAM; 

Así, una vez más:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

Sé consciente de que InnoDB y MyISAM tienen sus diferencias de velocidad. Una leer más rápido, otro escribe más rápido (leer más sobre esto en el Internet)

+1

Debe tenerse en cuenta que InnoDB de MySQL 5.6 tiene índices de texto completo –

1

palabras de parada desactivar para realizar búsquedas textuales en MySQL utiliza este pasos

1: my.ini abiertas en MySQL

el 2: por debajo de dos líneas después de [mysqld] línea en my.ini (buscar [mysqld] en el archivo)

ft_min_word_len=1 
ft_stopword_file="" 

3: reinicie el servidor

4: reparar la tabla usando a continuación comando

> repair table tablename; 

5: Ahora la búsqueda está trabajando ....

0

intentar usar PARTIDO CONTRA ... ... EN MODO BOOLEANA como ésta: partido en el que (autor, título) CONTRA (' "origen de" 'EN MODO BOOLEANO);

+0

detener palabras no están en los índices de texto completo, por lo que incluso si usa el modo booleano, no regresará cualquier cosa –

0

establecer ft_stopword_file = ""
no funcionó para mí, estoy usando tablas InnoDB y MySQL 5.6 (parada palabras todavía no indexadas en los índices de texto completo después de optimizar tabla asociada)

esta solución funciona (incluso si usted no es superusuario):

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB; 
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword'); 

para todos los usuarios, pero que aún necesita derechos de superusuario:

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist'; 

por sólo el usuario (suponiendo que el que recrear índices y columnas actualización)

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist'; 

ya que es una variable de sesión, que no durará cuando la sesión se cierra así que por favor asegúrese de que establece que en el cada sesión o antes de optimizar o insertar en tablas con índice de texto completo o cuando actualiza la columna indexada por el índice de texto completo

Cuestiones relacionadas