У меня есть таблица MySQL 5.5.4 с> 200M строками, которая имеет индекс FULLTEXT в двух столбцах (заголовок, тело).
Когда я выполняю простой запрос FULLTEXT в режиме NATURAL LANGUAGE по умолчанию для некоторых популярных результатов (они возвращают 2M + строк), я получаю ноль строк:
SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('fubar');
Но когда я выполняю запрос FULLTEXT в режиме BOOLEAN, я вижу, что строки, о которых идет речь, действительно существуют (я получаю 2M + обратно, в зависимости от):
SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('+fubar' IN BOOLEAN MODE);
У меня есть несколько запросов, которые возвращают ~ 500K строк, которые нормально работают в любом режиме, поэтому, если это связано с размером результата, кажется, что он возникает где-то между 500K и немного севернее 2M.
Я пробовал играть с различными переменными размера буфера, но безрезультатно. Это явно не 50% -ный порог, поскольку мы не возвращаем 100 миллионов строк ни при каком результате.
Любые идеи?
Поведение, которое вы видите, было задумано. При использовании запроса на естественном языке (NLQ), если общее количество документов, содержащих термин, превышает 2 миллиона, вес будет равен 0.
Это делается в следующих строках /storage/myisam/ft_nlq_search.c:
gweight=word->weight*GWS_IN_USE;
if (gweight < 0 || doc_cnt > 2000000)
gweight=0;
По ревизии 1346.322.1 это было исправление для предотвращения «переполнения дерева».
Вероятно, что эти столбцы не индексируются. Соответствующий раздел руководство:
Список столбцов MATCH () должен точно совпадать со списком столбцов в каком-либо определении индекса FULLTEXT для таблицы, если только этот MATCH () не находится в BOOLEAN MODE. Поиск в логическом режиме может выполняться по неиндексированным столбцам, хотя, скорее всего, он будет медленным.
Это объясняет, почему вы видите другое поведение в логическом режиме.