Greg:
я тоже сейчас озадачен этим вопросом. есть такие мысли: по твоему вопросу
как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?
1.очевидно, что нужно искать вхождение подстроки в строку (функции зависят от языка). вычислить длину строки и определить относительную величину, которая и покажет, насколько близко искомая строка находится к началу строки, в которой ищем
2. к релевантности нужно наверное еще отнести частоту вхождения слова или фразы в строку, в которой ищем. можно с учетом словоформ, что сложнее организовать
3. в третьих нужно определить насколько важен текст. т.е. если в строке содержаться HTML-теги, то вероятнее всего, что текст в теге , будет важнее, чем в теге
, в котором могут содержаться только дополнительные сведения
вот пока такие мысли. будем думать вместе?
Появилась мысль насчет пункта №1,2 (после изучения структуры базы phpbb)
Итак.
1) Есть база всех слов, которые есть в товарах c двумя полями:
ID, слово
2) Есть таблица пересечений слов и товаров
ID слова, ID товара, первое началие слова относительно начала строки
у таблицы товаров добавляем дополнительное поле - кол-во слов.
Далее поиск.
1) Определеям ID слов и пихаем их в массив.
2)
Тут математика да и только: если найдено слово оцениваться его знаимочть вот так: сумма_всего("колво слов"-"цена входения"/("колво слов"+1))
Примерный вид SQL-запроса.
SELECT `produсts`.*, SUM((`products`.`words_in`-`products_words_in`.`rate`)/`products`.`words_in`-1) AS `page_rating`
FROM `products`,`products_words_in`
WHERE `products_words_in`.`product_id`=`products`.`id`
AND `products_words_in`.`word_id` IN (1,2,4,5)
GROUP BY `produсts`.`id
ORDER BY `page_rating` DESC
Только у данного метода релавантности я уже обнаружил один минус:
Допустим поисковая строка
чашка кофе.
Поиск идем по этим строчкам:
Кофе я не пью, где моя
чашка чая.
7/7+1/7=1.142
Официант, я давно сделал заказ, где моя
чашка кофе.
2/8+1/8=0.25
Естественно пока ничего не проверял, даже немного сомневаюсь в работоспособности запроса. Но всё же.