Программирование > Теория, алгоритмы и стандарты
Релеватность и поиск
AlieN:
Вот собственно задался вопросом, как это реализовывать.
Допустим есть некая база товаров, у каждой записи есть отдельное тестовое поле индекс, куда скинуты в порядке значимости все остальные текстовые поля, всякая пурга удалена и т.д. и т.п..
Вопрос в другом, как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?
Искал в инете статьи, ничего путного не нашел.
Greg:
я тоже сейчас озадачен этим вопросом. есть такие мысли:
по твоему вопросу
--- Цитировать ---как реализовать поиск, где релевантность будет оцениваться близостью поисковой фразы к началу строки?
--- Конец цитаты ---
1.очевидно, что нужно искать вхождение подстроки в строку (функции зависят от языка). вычислить длину строки и определить относительную величину, которая и покажет, насколько близко искомая строка находится к началу строки, в которой ищем
2. к релевантности нужно наверное еще отнести частоту вхождения слова или фразы в строку, в которой ищем. можно с учетом словоформ, что сложнее организовать
3. в третьих нужно определить насколько важен текст. т.е. если в строке содержаться HTML-теги, то вероятнее всего, что текст в теге , будет важнее, чем в теге , в котором могут содержаться только дополнительные сведения
вот пока такие мысли. будем думать вместе? :)
CGVictor:
AlieN
Вытаскиваешь из базы все записи, где есть вхождение подстроки, потом сортируешь в соответствии со своим алгоритмом релевантности. Сортировать, скорее всего, как и реализовывать алгоритм, придется уже в коде, а не на уровне базы.
AlieN:
--- Цитировать ---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
Естественно пока ничего не проверял, даже немного сомневаюсь в работоспособности запроса. Но всё же.
Greg:
AlieN
мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку
Навигация
Перейти к полной версии