SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 27.10.2009 21:01:16

Pusichka
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Fulltext. Ищет не то.

Доброго времени суток. Совершенно недавно познакомился с полнотекстовым поиском и его возможностями. Бесспорно ряд + перекрывает его недостатки, особенно скорость поиска. Сейчас столкнулся с такой проблемой и буду презнателен за помощь.
Ряд примеров, по которым становится ясно, что есть проблемы с поиском. Не знаю, поможет это или нет, но работаю я с AJAX'ом. Поиск происходит когда я нажимаю клавишу.(<input type = 'text' id = 'search' size = '12' onkeyup = 'ajax_search()'>)

Пример 1: Есть ряд полей с записями
(1) http://localhost/Tools/phpMyAdmin/
(2) http://www.php.ru/manual/php/html/funct … ecode.html

Если ввести в поле 'http', то отобразятся только номера (1), (2)
Если ввести в поле 'http://loc', то отображаются те же поля.

Пример 2: Есть ряд полей с записями
(1) http://localhost/Tools/phpMyAdmin/
(2) http://www.php.ru/manual/php/html/funct … ecode.html

Если ввести в поле 'php', то отобразится только номер (1)

Не понимаю, почему это так происходит и буду благодарен Вам за помощь.
Код поиска:
    $string = "SELECT * FROM `_____` WHERE MATCH (`______`) AGAINST ('".mysql_real_escape_string($text)."*' IN BOOLEAN MODE)";


П.С. На всякий случай, чтобы сэкономить Ваше время, отмечу, что перед постом сделал REPAIR таблицы.
П.П.С. Если во втором примере я еще понимаю, что, возможно, проблемы связаны со слешами перед словом "php" и после, а поскольку минимальная длина искомого слова - 4 символа, то он второе и не выдает, но а что делать с первым примером? Почему там так?

И еще - вопрос не по теме. POST запрос на сервере хоста экранирует  символы. Как это можно отключить и можно ли вместо mysql_real_escape_string использовать htmlspecialchars() чтобы если я добавлю символы "'" или другие экранируемые сиволы - они не экранировались?

Неактивен

 

#2 27.10.2009 21:56:40

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

Re: Fulltext. Ищет не то.

Полнотекстовый поиск работает именно по словам, а не как-либо иначе. Сделал
табличку по аналогии с Вашей:

Код:

mysql> select * from ft;
+----------------------------------------------------+
| a                                                  |
+----------------------------------------------------+
| http://localhost/Tools/phpMyAdmin/                 | 
| http://ru.php.net/manual/en/function.urldecode.php | 
+----------------------------------------------------+
2 rows in set (0.00 sec)

ну и вот, что реально попадает в индекс:

Код:

celestia:/var/lib/mysql/test# myisam_ftdump -d ft 0
       2c            0.9560229 function
        0            0.9560229 http
       2c            0.9560229 http
        0            0.9560229 localhost
       2c            0.9560229 manual
        0            0.9560229 phpmyadmin
        0            0.9560229 tools
       2c            0.9560229 urldecode

Собственно, сравнение индексного файла и выдачи объясняет Ваши результаты smile
1. Короткое слово php из второй строки не индексируется, т.к. короткое (ft_min_word_len=4);
2. В первом же примере — попробуйте разбить Ваш запрос на отдельные слова, тогда
станет понятно, что Ваш запрос эквивалентен "http loc*", слово http находится в обеих строках.

Неактивен

 

#3 27.10.2009 22:58:14

Pusichka
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Re: Fulltext. Ищет не то.

То есть, получив строку, лучше ее разбить на слова preg_match'ем используя модификатор \b, затем к каждому слову добавить + и соединить, не забыв про пробелы? И затем в Mysql?

Неактивен

 

#4 27.10.2009 23:19:34

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

Re: Fulltext. Ищет не то.

Совершенно необязательно. Просто не нужно ожидать, что полнотекстовый поиск
будет искать что-то кроме отдельных слов. В частности, поиск по url в случае с
http будет выбирать все строки до какого-то размера базы, а потом перестанет
выбирать вообще, т.к. http станет стопсловом (на самом деле, не понятно, почему
не стало сразу — оно есть в обеих строках).

Неактивен

 

#5 27.10.2009 23:27:02

Pusichka
Участник
Зарегистрирован: 27.10.2009
Сообщений: 6

Re: Fulltext. Ищет не то.

Теперь ясно. Спасибо. А не стало оно стоп словом, потому что у меня там еще записи есть smile))

У меня только 1 вопрос еще. Буду не менее признателен. Если search string = 'lala lolo', как ее разбить можно? Есть советы? Я хочу вставить '+' все-таки перед каждым. Если со ссылкой так и нецелесообразно может делать, то если будут искать часть текста, надо smile a-z, a-Z не подойдет, потому что могут использовать и отличные от русского и англ. языки

использую:
    preg_match_all("#\b(\w+)\b#", $text1, $text);
    print_r ($text);

Выдает ошибку.
Не поможете с этим. Очень большие проблемы с регуляторными выражениями.

Неактивен

 

#6 27.10.2009 23:41:08

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

Re: Fulltext. Ищет не то.

Это скорее вопрос по ПХП, а их задают на webew.ru wink

$text = preg_replace('#\b(\w+)\b#', '+$1', $text);

Неактивен

 

Board footer

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