PHP,MySQL и ролевантность

Форум для программистов

Сообщение ita » Пт фев 25, 2005 2:06 pm

делается поисr по базе данных, по одному полю, для поля сделан FULLTEXT index, все ищет, все нормально вроде..
вот только..

1. если брать запрос типа:
Код: выделить все
SELECT nick,title,description, MATCH(title)
AGAINST ('".addslashes($sw)."') AS score
FROM games_info WHERE status != 'd'
and MATCH (title) AGAINST ('".addslashes($sw)."')
ORDER BY score DESC


находятся только поля в которых слова точно соответствуют $sw
('%".$sw."%' - не предлагать, работает точно так же)

2. если предварительно сделать $sw=str_replace(" ","* ",$sw);
и в запросе AGAINST ('".addslashes($sw)."') заменить на
AGAINST ('".addslashes($sw)."' IN BOOLEAN MODE)
то ишет все, что нужно, но! score теперь везде равно 1..

3. можно конечно сделать как в пункте 2, выбрать все в массив, самому посчитать ролевантность для каждой записи, но тут возникает проблема с постраничным выводом..

отсюда вопрос: КАК???
1. искать нужно по корню слова(нескольких слов в запросе).
2. результат сортировать по ролевантности.
3. выводить результаты разбивая их постранично.

чтот я уже вообще ничего придумать не могу как это сделать..

З.Ы. подробности по полнотекстовуму поиску в MySQL
<a href='http://www.mysql.ru/docs/man/Fulltext_Search.html' target='_blank'>http://www.mysql.ru/docs/man/Fulltext_Search.html</a>
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение eduha » Сб фев 26, 2005 2:21 am

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->если предварительно сделать $sw=str_replace(" ","* ",$sw);
и в запросе AGAINST ('".addslashes($sw)."') заменить на
AGAINST ('".addslashes($sw)."' IN BOOLEAN MODE)
то ишет все, что нужно, но! score теперь везде равно 1..<!--QuoteEnd--></div><!--QuoteEEnd-->
При использовании IN BOOLEAN MODE релевантность не подсчитывается...

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->искать нужно по корню слова (нескольких слов в запросе).<!--QuoteEnd--></div><!--QuoteEEnd-->
Можно самому составить список окончаний, которые нужно отбрасывать... То есть делать банальную замену.. А потом либо использовать FULLTEXT и * в BOOLEAN MODE, либо LIKE '%...%'

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->результат сортировать по ролевантности.<!--QuoteEnd--></div><!--QuoteEEnd-->
Хм... Возможно, similar_text()? Только как это повлияет на скорость сортировки...

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->выводить результаты разбивая их постранично.<!--QuoteEnd--></div><!--QuoteEEnd-->
Можно заодно извлечь ID'ы записей, отвортировать все по релевантности, сгенерить уникальный ключ, занести в спец. таблицу (скажем, search_result), потом передать ключ по ссылке, и отобразить результаты. То есть скрипт разделяется не две части - одна ищет и заносит результаты в таблицу, а вторая извлекает результат из таблицы и отображает его...
<span style='color:blue'>Мэджик пипл, вуду пипл</span>
eduha
Капитан
 
Сообщений: 233
Зарегистрирован: Пн авг 11, 2003 4:39 pm
Откуда: Караганда / Казахстан
Пункты репутации: 0

Сообщение ita » Сб фев 26, 2005 7:41 am

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->При использовании IN BOOLEAN MODE релевантность не подсчитывается...<!--QuoteEnd--></div><!--QuoteEEnd--> вот и я о том же..
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->либо LIKE '%...%'<!--QuoteEnd--></div><!--QuoteEEnd--> не.. тогда многовато запросов получится. если в запросе несколько слов, то искать желатеьлно по каждому.
решил выбирать IN BOOLEAN MODE, ролевантность считать самому, результат во временную и из нее выводить
Последний раз редактировалось ita Сб фев 26, 2005 1:12 pm, всего редактировалось 1 раз.
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение eduha » Сб фев 26, 2005 12:30 pm

<!--QuoteBegin-ita+Feb 26 2005, 13:41--><div class='quotetop'>QUOTE(ita @ Feb 26 2005, 13:41)</div><div class='quotemain'><!--QuoteEBegin--><!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->либо LIKE '%...%'<!--QuoteEnd--></div><!--QuoteEEnd-->
не.. тогда многовато запросов получится
[right][snapback]166041[/snapback][/right]<!--QuoteEnd--></div><!--QuoteEEnd-->

Можно и одним запросом... LIKE '%word1%' or LIKE '%word2%' or LIKE '%word3%'
<span style='color:blue'>Мэджик пипл, вуду пипл</span>
eduha
Капитан
 
Сообщений: 233
Зарегистрирован: Пн авг 11, 2003 4:39 pm
Откуда: Караганда / Казахстан
Пункты репутации: 0

Сообщение ita » Сб фев 26, 2005 1:14 pm

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->Можно и одним запросом... LIKE '%word1%' or LIKE '%word2%' or LIKE '%word3%'<!--QuoteEnd--></div><!--QuoteEEnd--> а если и and надо? и фраза целиком..
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

cron