MATCH AGAINST в MySQL не отображает записи при поиске строки менее 4 символов - PullRequest
1 голос
/ 21 марта 2011

Я использую индекс FULLTEXT для столбца, и когда я использую MATCH .... AGAINST в логическом режиме для любого поискового запроса длиной менее 4 символов, он не возвращает никаких записей.И когда я использую LIKE, он возвращает записи.В чем может быть проблема?Это из-за какого-то ограничения MySQL, как будто он не индексирует слова длиной менее 4 символов, или из-за некоторых ограничений, специфичных для индекса FULLTEXT?

Спасибо

1 Ответ

2 голосов
/ 21 марта 2011

Проверьте системную переменную ft_min_word_len. Это определяет минимальную длину слов для индексации.

Обновление : Хорошо, я провел несколько тестов с ft_min_word_len=3

Первый тестовый стол

CREATE  TABLE `test`.`table1` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` TEXT NULL ,
  PRIMARY KEY (`id`) ,
  FULLTEXT INDEX `Name` (`name` ASC) )
ENGINE = MyISAM;

Следующие тестовые данные:

INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('1', 'This has led in it');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('2', 'Led is nice');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('3', 'Leds are nicer');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('4', 'Nothin here');
INSERT INTO `test`.`table1` (`id`, `name`) VALUES ('5', 'some word which does not exists: abcleddef');

Запуск этого:

SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led' in boolean mode)

Возвращает это:

1   This has led in it
2   Led is nice

Запуск этого:

SELECT * FROM `test`.`table1` t1 WHERE match(`t1`.`name`) against ('led*' in boolean mode)

Возвращает это:

1   This has led in it
2   Led is nice
3   Leds are nicer

Так что поиск FT работает, как и ожидалось. Есть шанс, что слово, которое вы пытаетесь найти, на самом деле похоже на leds, а не на одно слово led?

...