эмитация полнотекстового индекса на PHP

camka

не самка
эмитация полнотекстового индекса на PHP

Постановка задачи
-------------------------

Есть поисковик. На каждый запрос по поиску некой фразы он может выдавать N рекламных баннеров, так или иначе связаных с искомой фразой по ключевым словам. До сих пор все работало по логике точного совпадения. То есть если искомое слово полностью совпадает с проданным - показываются баннеры. Но пришли тяжкие времена. Кроме логики точного совпадение требуется внедрить еще и логику частичного совпадения. То есть, если искомая фраза в большей или меньшей степени соответствует некоторому количеству проданых слов, то отображать баннеры для этих слов.

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

Порблема в том, что связи с базой у меня на фронтэнде нету. Раз в день генерируются подключаемые файлы для каждого проданного слова и впоследствие копируются на фронтэтд, где успешно подключаются в случае совпадения с искомой фразой.

Вот и родилась идея сэмулировать полнотекстовой индекс и интерфейс для поиска по нему, прям как в MySQL. При генерации подключаемых файлов заодно генерировать и сей индекс, потом кидать его на фронтэнд, и там уже искать соответствия с искомой фразой и отдавать полученные результаты.

Вопров в том, где можно достать алгоритм работы подобного индекса, если это какая-то классика. Или может кто подскажет, иной вариант решения, или иной подходящий алгоритм. Но уж больно мне этот фуллтекст люб. Изумительно подходит. Плюс еще база у нас той версии, что пока не ведает о UTF-8.

Посоветуйте кто на что горазд или же отговорите меня от этой безумной идеи.

Спасибо.

-~{}~ 07.01.05 15:26:

О... нарвался на многосёрч... изучимс

-~{}~ 07.01.05 17:39:

Похоже, что он слишком громоздкий для такой маленькой задачи
 

neko

tеam neko
я личчно ничего не понял
ты опередлись в главном
тебе что нужно сделать?

я не верю в эти рассказы про алгоритмы для индексов
вон пожалуйста бери из любой субд и изучай какие проблемы как там индекс строится да релевантность считается

tsearch для постгре в исходниках -- половина гамлета
 

camka

не самка
я просто надеялся, что существует некое готовое решение для реализации нечто такого, что я сейчас попытаюсь описать псевдокодом
PHP:
<php
$database = array(
'hotels','real estate', 'driving drunk', 'best games ever', 'mobile phones', 'games', 'movies', ....., 'best movies'
);
$indexer = new indexer();
foreach($database as $phrase)
     $indexer->add_phrase($phrase);
$indexer->store('/my/file/index.zzz');
?>

<?php
$word = 'movies';
$analyzer = new analyzer();
$analyzer->load_index('/my/file/index.zzz');
$analyzer->load_word($word);
foreach($analyzer as $similar)
     echo $i++.' - '.$similar."\n".

?>
Код:
===output====
movies
best movies
вполне бы подошел многосёрч, но я в нем не обнаружил возможности настолько простой манипуляции с данными. В рнр экстеншене функции только для получения данных, а не загрузки их. Для загрузки же используются некие демоны индексеры и им подобные монстры.

Кстати вот еще интересное чтиво на эту тему нашел
http://www.citforum.ru/pp/search_03.shtml
 

fisher

накатила суть
решение существует - называется инвертированный индекс. и эмулировать ничего не надо - проверено, что инвертированный индекс работает быстрее fulltext поиска + ты сам контролируешь релевантность. минусы (как и fulltext) - скорость (цифры очень зависят от параметров системы), если вдруг нагрузки меньше ~10**2 hit/sec скорость будет вполне.

-~{}~ 19.01.05 11:06:

sorry - сравнение fulltext c inverted idx и оценки - только для mysql
 

camka

не самка
Спасибо.
Оказалось, что сваянный мною намедни классик почти реализует этот алгоритм (чуть не описАлся - алКоритм). Впоследствие пришлось его слегка кастомизировать, чтобы в результаты выдавальсь лишь те фразы, *все* слова из которых присутствуют в поисковой фразе, дабы предотвратить нежелаемые казусы типа:

Ищем: "детские игрушки"
Получаем: "сексуальные игрушки"
, потому как совпало слово "игрушки"

Индексы держу в файле в виде сериализованных многомерных ассоциативных массивов.
 
Сверху