Поиск 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);
Ответ 2
Слова в 50% строк или более не совпадают. См. Mysql doc:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html