sql >> Base de Datos >  >> RDS >> Mysql

Búsqueda de texto completo de MySQL en varias columnas:confusión de resultados

Parece que las tablas de InnoDB no permiten búsquedas en varios índices de texto completo en el mismo MATCH() condición.

Aquí sus campos no pertenecen todos a la misma tabla, por lo tanto, están cubiertos por diferentes índices. Observe que se aplica la misma limitación si tuviera una tabla como esta:

CREATE TABLE t (
  f1 VARCHAR(20),
  f2 VARCHAR(20),
  FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;

SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row

parece una búsqueda de texto completo solo puede buscar en el primer índice de texto completo que encuentra pero esto es solo algo que deduzco de esta experiencia , por favor, no dé esto por sentado.

La conclusión es que debe dividir su búsqueda para usar un solo índice de texto completo por MATCH() cláusula:

SELECT * FROM auction, user, gallery, ...
WHERE
    MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(user.field1, user.field2, user.field3) AGAINST...

Esta es una ilustración de una posible consulta si tuviera dos índices distintos en auction y uno en user . Debe adaptarlo a su estructura actual (por favor, publique las descripciones de sus tablas si necesita más orientación).

Tenga en cuenta que esto solo se aplica a las tablas de InnoDB. Curiosamente, las tablas MyISAM no parecen mostrar la misma limitación .

Actualización:resulta que esto fue un error en el motor InnoDB , corregido en 5.6.13/5.7.2. El ejemplo anterior ahora falla correctamente con "No se puede encontrar el índice FULLTEXT que coincida con la lista de columnas". De hecho, no hay índice en (f1, f2) , pero uno en (f1) y otro en (f2) . Como aconseja el registro de cambios :

Cabe señalar que, si bien estas consultas devuelven un conjunto de resultados correcto con MyISAM, se ejecutan más lentamente de lo que cabría esperar, como ignoran silenciosamente los índices de texto completo existentes .