mysql full-text-search

error de búsqueda de texto completo de mysql



full-text-search (1)

-- drop table testproduct; CREATE TABLE testproduct ( Id VARCHAR(16), prod_name TEXT, ProductIdType VARCHAR(8), PRIMARY KEY (Id), FULLTEXT (prod_name) ) ENGINE=MyISAM; insert into testproduct (id,prod_name,productidtype) values (''B00005N5PF'',''one pen and a good price for a pen'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''B570J5XS3C'',null,''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C00ZZ5N5PF'',''let us get rid of some noise'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''D00LL5N5PA'',''four score and seven years ago our fore...'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''EEEZZ5N5PF'',''he has a harpoon'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C01ZZ5N5PF'',''and then we'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''B00ZZ5N5PF'',''he has a pen in his pocket not a banana'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C02ZZ5N5PF'',''went to the store'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C03ZZ5N5PF'',''and decided that we should buy some'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C04ZZ5N5PF'',''fruit cups or fruit or berries or pebbles'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C037Z5N5PF'',''then he and her she and it'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''C04K95N5PF'',''threw some daggers and a harpoon'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''D88895N5PF'',''more noise and some of this'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''D34595N5PF'',''this article about harpoons really drills into the throwing of harpoon or harpoons to those that deserve a harpoon'',''ASIN''); insert into testproduct (id,prod_name,productidtype) values (''D12395N5PF'',''and there we go'',''ASIN'');

La búsqueda de texto completo necesita cierta variedad para deshacerse del "ruido" repetido. Las pruebas con datos mínimos arrojarán malos resultados. Lanza toda tu colección para que salga algo significativo. Hay configuraciones para el tamaño mínimo de palabras, incluso se intentó buscar como se ve en algunos enlaces a continuación.

Para las palabras

Hay listas MySql de palabras de detención en varios idiomas que representan palabras insignificantes omitidas durante el proceso de búsqueda. Esa lista se compila en el servidor, pero se puede anular como se ve en esta página del manual y el texto:

Para anular la lista de palabras por defecto predeterminada, configure la variable de sistema ft_stopword_file. (Consulte la Sección 5.1.4, “Variables del sistema del servidor”.) El valor de la variable debe ser el nombre de la ruta del archivo que contiene la lista de palabras clave o la cadena vacía para deshabilitar el filtrado de palabras clave. El servidor busca el archivo en el directorio de datos a menos que se proporcione un nombre de ruta absoluto para especificar un directorio diferente. Después de cambiar el valor de esta variable o el contenido del archivo de palabras de parada, reinicie el servidor y reconstruya sus índices FULLTEXT.

Algunas consultas de muestra

-- select * from testproduct SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST(''score'' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST(''harpoon'' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST(''banana'' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST(''years'' IN BOOLEAN MODE);

para que coincidan varias palabras:

SELECT id,prod_name, match( prod_name ) AGAINST ( ''+harpoon +article'' IN BOOLEAN MODE ) AS relevance FROM testproduct ORDER BY relevance DESC

Da un peso real en la columna de relevance :

SELECT id,prod_name, match( prod_name ) AGAINST ( ''+harpoon +article'' IN NATURAL LANGUAGE MODE) AS relevance FROM testproduct ORDER BY relevance DESC +------------+--------------------------------------------------------------------------------------------------------------------+--------------------+ | id | prod_name | relevance | +------------+--------------------------------------------------------------------------------------------------------------------+--------------------+ | D34595N5PF | this article about harpoons really drills into the throwing of harpoon or harpoons to those that deserve a harpoon | 3.6207125186920166 | | EEEZZ5N5PF | he has a harpoon | 1.2845110893249512 | | C04K95N5PF | threw some daggers and a harpoon | 1.2559525966644287 | |------------+--------------------------------------------------------------------------------------------------------------------+--------------------+

Levantó la sección de palabras múltiples de here . Gracias Spencer

Esto es lo que probé.

mysql> select * from product; +------------+---------+---------------+ | Id | Product | ProductIdType | +------------+---------+---------------+ | B00005N5PF | one pen | ASIN | | B000J5XS3C | | ASIN | +------------+---------+---------------+ 2 rows in set (0.00 sec) mysql> select * from product p where match (p.Product) against (''pen'' in boolean mode); Empty set (0.00 sec) mysql> select * from product p where match (p.Product) against (''one pen'' in boolean mode); Empty set (0.00 sec)

Esta es la declaración de crear.

CREATE TABLE product ( Id VARCHAR(16), Product VARCHAR(128), ProductIdType VARCHAR(8), PRIMARY KEY (Id), FULLTEXT (Product) ) ENGINE=MyISAM;

El signo igual y ''ME GUSTA'' funcionan bien. ¿Entonces por qué?