Por que esta consulta FULLTEXT do MySQL está retornando 0 linhas quando as linhas correspondentes estão presentes?

2

Eu tenho uma tabela do MySQL 5.5.4 com > 200M linhas que tem um índice FULLTEXT em duas colunas (Title, Body).

Quando faço uma consulta FULLTEXT simples no modo NATURAL LANGUAGE padrão para alguns resultados populares (eles retornam 2M + linhas), estou recebendo zero linhas de volta:

SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('fubar');

Mas quando eu faço uma consulta FULLTEXT no modo BOOLEAN, posso ver que as linhas em questão existem (recebo 2M + de volta, dependendo):

SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('+fubar' IN BOOLEAN MODE);

Eu tenho algumas consultas que retornam ~ 500K linhas que estão funcionando bem em qualquer um dos modos, portanto, se é relacionado ao tamanho do resultado, ele aparece em algum lugar entre 500K e um pouco ao norte de 2M.

Eu tentei brincar com as várias variáveis de tamanho de buffer, sem sucesso. Não é claramente o limite de 50%, já que não estamos recebendo 100 milhões de linhas de volta por qualquer resultado.

Alguma idéia?

    
por Don MacAskill 05.03.2011 / 00:19

2 respostas

1

O comportamento que você vê é por design. Ao usar a consulta de idioma natural (NLQ), se o número total de documentos que contêm o termo for maior que 2 milhões, o peso será 0.

Isso é feito nas seguintes linhas de /storage/myisam/ft_nlq_search.c :

gweight=word->weight*GWS_IN_USE;
if (gweight < 0 || doc_cnt > 2000000)
  gweight=0;

De acordo com a revisão 1346.322.1 este era um bugfix para evitar "estouro de árvore".

Parece que você terá que mudar para Esfinge ou um Lucene .

    
por 07.03.2011 / 09:35
-1

É provável que essas colunas não estejam sendo indexadas. A seção relevante do manual :

The MATCH() column list must match exactly the column list in some FULLTEXT index definition for the table, unless this MATCH() is IN BOOLEAN MODE. Boolean-mode searches can be done on nonindexed columns, although they are likely to be slow.

Isso explicaria por que você está vendo um comportamento diferente no modo booleano.

    
por 05.03.2011 / 05:00