Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisa de texto completo do MySQL em várias colunas:confusão de resultados


Parece que as tabelas InnoDB não permitem pesquisas em vários índices de texto completo no mesmo MATCH() doença.

Aqui seus campos não pertencem todos à mesma tabela, portanto são cobertos por índices diferentes. Observe que a mesma limitação se aplica se você tiver uma tabela 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 uma pesquisa de texto completo pode pesquisar apenas no primeiro índice de texto completo que encontrar mas isso é apenas algo que deduzo a partir desta experiência , por favor, não tome isso como garantido.

A conclusão é que você deve dividir sua pesquisa para usar um único í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 é uma ilustração de uma possível consulta se você tiver dois índices distintos no auction e um em user . Você precisa adaptá-lo à sua estrutura real (por favor, poste as descrições de suas tabelas se precisar de mais orientação).

Observe que isso se aplica apenas a tabelas InnoDB. Curiosamente, as tabelas MyISAM não parecem mostrar a mesma limitação .

Atualização:acontece que isso foi um bug no mecanismo InnoDB , fixado em 5.6.13/5.7.2. O exemplo acima agora falha com razão com "Não é possível encontrar o índice FULLTEXT correspondente à lista de colunas". De fato, não há índice em (f1, f2) , mas um em (f1) e outro em (f2) . Como o changelog aconselha :

Vale ressaltar que, embora essas consultas retornem um conjunto de resultados correto com o MyISAM, elas são executadas mais lentamente do que o esperado, pois eles ignoram silenciosamente os índices de texto completo existentes .