SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.03.2010 00:56:32

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

FULL TEXT SEARCH

Подскажите, пожалуйста, почему match against в моем случае ничего не возвращает? На колонке word тип индекса FULLTEXT.


mysql> SHOW COLUMNS FROM words;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| word_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| word_lang | int(11)      | YES  |     | NULL    |                |
| word      | varchar(255) | NO   | MUL |         |                |
+-----------+--------------+------+-----+---------+----------------+
mysql> select * from words;
+---------+-----------+---------------------------+
| word_id | word_lang | word                      |
+---------+-----------+---------------------------+
|       1 |         2 | dog                       |
|       5 |         2 | dog anchor                |
+---------+-----------+---------------------------+
mysql> select word_id from words where match(word) against ('dog');
Empty set (0.00 sec)
 

Неактивен

 

#2 17.03.2010 01:07:04

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: FULL TEXT SEARCH

Похоже, ответ в этом:

www.mysql.ru написал:

Для разбивки текста на слова MySQL использует очень простой синтаксический анализатор. ``Словом'' является любая последовательность символов, состоящая из букв, чисел, знаков `'' и `_'. Любое ``слово'', присутствующее в стоп-списке (stopword) или просто слишком короткое (3 символа или меньше), игнорируется.

Каждое правильное слово в наборе проверяемых текстов и в данном запросе оценивается в соответствии с его важностью в этом запросе или наборе текстов. Таким образом, слово, присутствующее во многих документах, будет иметь меньший вес (и даже, возможно, нулевой), как имеющее более низкое смысловое значение в данном конкретном наборе текстов. С другой стороны, редко встречающееся слово получит более высокий вес. Затем полученные значения весов слов объединяются для вычисления релевантности данной строки столбца.

Описанная техника подсчета лучше всего работает для больших наборов текстов (фактически она именно для этого тщательно настраивалась). Для очень малых таблиц распределение слов не отражает адекватно их смысловое значение, и данная модель иногда может выдавать некорректные результаты.

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)
Поиск по слову ``MySQL'' в предыдущем примере не приводит к каким-либо результатам, так как это слово присутствует более чем в половине строк. По существу, данное слово целесообразно трактовать как стоп-слово (т.е. слово с нулевой смысловой ценностью). Это наиболее приемлемое решение - запрос на естественном языке не должен возвращать каждую вторую строку из таблицы размером 1Гб.

Могли бы вы предложить вариант запроса, который выведет из предложенной мной выше таблицы и вариант "dog" и "dog anchor" и "anchor dog" (если бы он присутствовал третей строкой)? Не регулярные выражения.

Отредактированно FiMko (17.03.2010 01:08:46)

Неактивен

 

#3 17.03.2010 18:45:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: FULL TEXT SEARCH

Интересно, почему в этой статье не рассказали про ft_min_word_len wink

Собственно, нужно поставить значение переменной в три, например, и переиндексировать
табличку (проще всего пересоздать ALTER TABLE words ENGINE=MyISAM).

Дочитал до конца; очевидно, на двух строках, содержащих dog, это работать не будет,
т.к. в данном случае это и правда будет стопсловом (даже при нормальной установленной
длине). Но если рядом накидать мусорных строк, то должно работать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson