Программирование > Теория, алгоритмы и стандарты

Релеватность и поиск

(1/5) > >>

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
мне кажется, что тогда нужно искать сначала полное совпадение фразы + позиция в строке, а затем уже слова по отдельности или фраза минус одно слово, минус два слова и т.д. - т.е. сделать переборку

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии