Поиск FULLTEXT в MySQL не возвращает никаких строк

Я немного потерян, это выглядит как глупая ошибка, но я понятия не имею, что это может быть. Вот тестовый сеанс:

mysql> drop table articles;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE articles (body TEXT, title VARCHAR(250), id INT NOT NULL auto_increment, PRIMARY KEY(id)) ENGINE = MYISAM;
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER TABLE articles ADD FULLTEXT(body, title);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into articles(body) values ('Maya');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM articles  WHERE MATCH(title, body) AGAINST('Maya');
Empty set (0.00 sec)

mysql> select * from articles
    -> ;
+------+-------+----+
| body | title | id |
+------+-------+----+
| Maya | NULL  |  1 |
+------+-------+----+
1 row in set (0.00 sec)

Это находится на "mysqld Ver 5.1.37-1ubuntu5 для debian-linux-gnu на i486 ((Ubuntu))".

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

CREATE TABLE articles (body TEXT, title VARCHAR(250), id INT NOT NULL auto_increment, PRIMARY KEY(id)) ENGINE = MYISAM;
ALTER TABLE articles ADD FULLTEXT(body, title);
insert into articles(body) values ('Maya');
SELECT * FROM articles  WHERE MATCH(title, body) AGAINST('Maya');     

Ответы

Ответ 1

В MySQL существует три типа полнотекстовых поисков:

  • логический поиск
  • поиск по естественному языку (используется по умолчанию)
  • запрос расширения запроса

От Инструкция по использованию MySQL:

Поиск в естественном языке интерпретируется строка поиска как фраза в естественный человеческий язык (фраза в открытый текст). Специальных операторы. Список заметок применяется. Кроме того, слова, которые присутствуют в 50% или более строк считаются общими и не совпадают.Полнотекстовые поиски являются естественными поиск языка, если IN NATURAL Модификатор режима LANGUAGE MODE задан или если модификатор не указан.

Например, попробуйте добавить еще две записи:

INSERT INTO articles(body) VALUES ('Some text'), ('Another text');

И снова запустите тот же SELECT - он будет работать.

В качестве обходного пути вы можете использовать логический режим, который не имеет этого правила "50%":

SELECT * FROM articles  WHERE MATCH(title, body) AGAINST('Maya' IN BOOLEAN MODE);