Поиск подскажите алгоритм релевантности.

vGhost

Guest
Поиск подскажите алгоритм релевантности.

Вобщем суть проблемы, есть текстовая база.
textid, text
Нужно сделать поиске по полю текст.
http://detail.phpclub.ru/article/mysql_search не предлогать - видел, читал. Не катит. Тормозить будет.
FULLTEXT индексы тоже предлогать не стоит. Слишком большие объёмы информации.

mysql>SELECT `textid` FROM `content` WHERE MATCH(`content`) AGAINST ('good') limit 1000;

1000 row in set (15,11 sec)

А ежели сделать
mysql>SELECT Count(*) WHERE MATCH(`content`) AGAINST ('good') limit 1000;
ждать можно десятки минут.

IN BOOLEAN MODE штука хорошая, но юзер будет ограничен всего 1000 результатами (иначе слишком много результатов будет, на слово good например почти 200,000 совпадений). Посему эта 1000 должна быть наиболее релевантной так что IN BOOLEAN MODE тоже отпадает.

Идей такова:
табличка word: wordid word
табличка index: wordid textid, score

В табличке index хранится не более 1000 записей на каждый wordid (больше никак иначе база будет весить гигабайты) при появлении излишка удаляеся самая "не релевантная" и вставляется "более релевантная" запись.

А теперь суть проблемы:

ПОДСКАЖИТЕ АЛГОРИТ КАК ЭТУ РЕЛЕВАНТНОСТЬ РАСЧИТЫВАТЬ!
Или хотябы ссылки где почитать можно методы расчёта релевантности слова в тексте.
Пытал яндексом найти хоть что то. Хрен там. SEOшники весь инет засрали тем как оптимизировать титлы и мета теги на сайтах для поисковых систем:( Да ещё программы предлогают купить которые будут анализировать эти сайты с учётом хтмл и предсказывать ваши позиции в яндексах шмандексах и прочих.. А мне оно нафиг не нуно... Мне нужен сам алгоритм как считать эту весомость слова в тексте.
Подскажите кто что третий день мучаюсь ужо.
нечего умнее

$XF = 0.5;
$YF = 25;

$XP = 0.1;
$YP = 100;


$SCORE = ( ($Count / $Total > $XP) ? (-$Count / $Total) : ($Count / $Total) ) * $YP;
$SCORE += ( ($Pos / $Total > $XF) ? (1 - $XF) : (1 - ($Pos / $Total)) ) * $YF;

в голову пока не пришло:(

Люди добры, поможите кто чем может, сами мы не месные....:)
 

crocodile2u

http://vbolshov.org.ru
MATCH(`content`) AGAINST ('good') - это и есть релевантность, по крайней мере как ее понимает MySQL
 

vGhost

Guest
Автор оригинала: crocodile2u
MATCH(`content`) AGAINST ('good') - это и есть релевантность, по крайней мере как ее понимает MySQL
Блин, да я знаю это! Прочти внимамтельно то что было написано ДО "ссуть проблемы". Не получится использовать фултекст индексы. Объём слишком большой. Тормозить будет безбожно.
 

crocodile2u

http://vbolshov.org.ru
Насколько я знаю, Fulltext Search - самый оптимальный способ поиска по тексту в MySQL. И кстати, откуда ты взял, что "будет тормозить"? Пробовал?
 

vGhost

Guest
Автор оригинала: crocodile2u
Насколько я знаю, Fulltext Search - самый оптимальный способ поиска по тексту в MySQL.
А ты с базами гигабайтных размеров пробывал работать с фултекст индексами? Пока размер таблички не превышает 100 мб всё просто замечательно, я сам его люблю юзать и давно уже применяю. Но вот когда размеры базы огромные он начинает нещадно тормозить. Ты пробывал с ним работать с базами в гиг и более? У меня такое впечатление что нет. Я вот пробывал, результат написан в первом посте читай внимательнее. Попробуй тоже, поймёш суть проблемы.

Автор оригинала: crocodile2u
И кстати, откуда ты взял, что "будет тормозить"? Пробовал?

mysql>SELECT `textid` FROM `content` WHERE MATCH(`content`) AGAINST ('good') limit 1000;

1000 row in set (15,11 sec)

Это по твоему нормальная скорость на одного клиента на пустом ВЫДЕЛЕННОМ сервере?

Автор оригинала: crocodile2u
Пробовал?
Я разве выше в самом первом посте таиминг запроса не написал?, А вариант с Count(*) кажется написал что ждать можно десятки минут, я уже не помню сколько, а выполнять запрос повторно меньше всего в жизни хочется, но я кажется написал что десятки минут. Думаеш я это с потолка снял? Хоть на самом деле меня Count(*) меньше всего интересует, но всётаки.
 
Сверху