MySQL MATCH ... ПРОТИВ иногда находит ответ, иногда нет - PullRequest
2 голосов
/ 01 ноября 2010

Следующие два запроса возвращают одинаковый (ожидаемый) результат, когда я запрашиваю свою базу данных:

SELECT * FROM articles 
 WHERE content LIKE '%Euskaldunak%'

SELECT * FROM articles 
 WHERE MATCH (content) AGAINST ('+"Euskaldunak"' IN BOOLEAN MODE)

Текст в поле содержимого, которое он ищет, выглядит следующим образом: "... Эти Euskaldunak, илиnewcomers ... "

Однако следующий запрос к той же таблице возвращает ожидаемый единственный результат:

SELECT * FROM articles 
 WHERE content LIKE '%PCC%'

А следующий запрос возвращает пустой результат:

SELECT * FROM articles 
 WHERE MATCH (content) AGAINST ('+"PCC"' IN BOOLEAN MODE)

Текст в поле содержимого, соответствующий этому результату, выглядит следующим образом: «... Портлендский общественный колледж (PCC) является крупнейшим ...»

Я не могу понять, зачем искать "Эускальдунак "работает с этим синтаксисом MATCH ... ПРОТИВ, а" PCC "- нет.Кто-нибудь видит что-то, чего я не вижу?

(Также: «PCC» не является общей фразой в этом поле - никакие другие строки не содержат слово, поэтому поиск на естественном языке не должен исключать его.)

Ответы [ 2 ]

3 голосов
/ 01 ноября 2010

Возможно, длина вашего полнотекстового минимального слова слишком велика. Я думаю, что по умолчанию 4, что объясняет, что вы видите. Установите значение 1, если хотите, чтобы все слова были проиндексированы независимо от длины.

Запустите этот запрос:

show variables like 'ft_min_word_len';

Если значения больше 3, и вы хотите получить попадания на слова короче этого, отредактируйте ваш /etc/my.cnf и добавьте или обновите эту строку в разделе [mysqld], используя значение, подходящее для вашего приложения:

ft_min_word_len = 1

Затем перезапустите MySQL и перестройте ваши полнотекстовые индексы, и все будет готово.

3 голосов
/ 01 ноября 2010

Есть две вещи, о которых я могу думать сразу. Во-первых, ваше значение ft_min_word_len установлено более чем в 3 символа. Любое «слово» меньше длины ft_min_word_len не будет проиндексировано.

Во-вторых, более 50% ваших записей содержат строку 'PCC'. Полнотекстовый поиск, который соответствует более 50% записей, считается неактуальным и ничего не возвращает.

Полнотекстовые индексы имеют правила, отличные от обычных строковых индексов. Например, есть список стоп-слов, поэтому некоторые общие слова, такие как,, и, не индексируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...