Error de búsqueda de texto completo de mysql

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 una statement de creación.

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

La señal igual y ‘LIKE’ funcionan bien. ¿Entonces por qué?

 -- 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 de la repetición de “ruido”. Las pruebas con datos mínimos arrojarán resultados pobres. Lanza toda tu colección para que salga algo significativo. Hay configuraciones para el tamaño mínimo de las palabras, incluso se intentó buscar, como se ve en algunos enlaces a continuación.

Para las palabras

Hay listas de MySql de Stop Words en varios idiomas que representan palabras insignificantes omitidas durante el proceso de búsqueda. Esa lista está comstackda en el servidor, pero puede ser anulada como se ve en esta Página de manual y texto:

Para anular la lista de palabras predeterminadas, configure la variable del 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 ruta del archivo que contiene la lista de palabras prohibidas, o la cadena vacía para deshabilitar el filtro de palabras prohibidas. 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 stopword, 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 obtener varias palabras que coincidan:

 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 desde aquí . Gracias spencer