[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Лучший алгоритм поиска.
coder
Прошу вашего совета - какой алгоритм поиска лучше? Я использую поиск в несколько заходов:
1) Поиск начальной строкой по имени файла
2) Строка разбивается на отдельные слова и ищется этими словами, опять по имени
3) Поиск начальной строкой по описанию файла
4) Поиск полученными словами по описанию файла
5) И, наконец, моя разработка - отсекание окончаний, суффиксов и другой гадости в конце слова и последующий поиск укороченными словами. Программа, если слова длиннее 6 символов, отсекает у него последние 3 символа. Если слово меньше 6 символов(но больше трех - на них программа вобще не обращает внимания) то его длинна приводится к 3 символам.

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

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

Вот. Представляю на ваше рассмотрение.



Спустя 41 минута, 50 секунд (6.05.2007 - 21:58) vasa_c написал(а):
Цитата
Прошу вашего совета - какой алгоритм поиска лучше?

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

Цитата
1) Поиск начальной строкой по имени файла

какой строкой? какого файла?

Цитата
2) Строка разбивается на отдельные слова и ищется этими словами, опять по имени

где ищется? какому имени? какая строка?

Цитата
3) Поиск начальной строкой по описанию файла

Что? Где?

Цитата
4) Поиск полученными словами по описанию файла

Когда?

Цитата
моя разработка - отсекание окончаний, суффиксов и другой гадости в конце слова и последующий поиск укороченными словами.

Боян

Цитата
Программа, если слова длиннее 6 символов, отсекает у него последние 3 символа.

Количество распространенных окончаний в русском языке не велико. Гораздо лучше отрезать что-то вроде /(а|о|на|ся)$/ чем просто убивать полслова.

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

Отстой. Выбери что-нибудь одно.

Цитата
Для сортировки я присваиваю каждой строке результатов что то вроде очков. Количество очков равно произведению длинны того массива символов, которым строку нашли, на количество вхождений этого массива символов в найденную строку.

Путано

Как бонус — Полнотекстовый поиск в MySQL

Спустя 27 минут, 16 секунд (6.05.2007 - 22:25) coder написал(а):
Цитата
Пять пунктов снизу это различные алгоритмы или последовательность действий?

Последовательность действий.
Цитата
1) Поиск начальной строкой по имени файла
какой строкой? какого файла?

Строка - это строка поиска введенная пользователем. Файл - у меня таблица с файлами(точнее с их именем описанием ссылкой и т.д)

Цитата
2) Строка разбивается на отдельные слова и ищется этими словами, опять по имени
где ищется? какому имени? какая строка?

Строка введенная пользователем. Ищется в таблице с файлами. По имени в смысле -
Код
$sql="SELECT * FROM $table WHERE name REGEXP '$word'";

Цитата
3) Поиск начальной строкой по описанию файла
Что? Где?

См. выше.
Цитата
4) Поиск полученными словами по описанию файла
Когда?

Полученными в смысле при разбиение начальной строки на отдельные слова.
Цитата
моя разработка - отсекание окончаний, суффиксов и другой гадости в конце слова и последующий поиск укороченными словами.
Боян

??
Цитата
Программа, если слова длиннее 6 символов, отсекает у него последние 3 символа.
Количество распространенных окончаний в русском языке не велико. Гораздо лучше отрезать что-то вроде /(а|о|на|ся)$/ чем просто убивать полслова.

Поверь мне, я этим интересовался, окончаний очень много. А ведь есть еще суффиксы постфиксы...

Цитата
Результаты каждого пункта заносятся в отдельную переменную, сортируются(отдельно в каждой переменной) и заносятся, по очереди, в одну общею переменную, которая уже будет выводится на экран.
Отстой. Выбери что-нибудь одно.

Не понялsad.gif В смысле что нибудь одно? У меня есть переменные - переменная с результатами, которые должны быть первыми, вторыми и т.д. Их нельзя перемешивать!

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

Пожалуйста - предложите как лучше.
Цитата

Спасибо - почитаю.

Спустя 4 дня, 15 часов, 56 минут, 4 секунды (11.05.2007 - 14:21) coder написал(а):
А насколько можно положиться вот на это чудо: морфологический разбор? Разумеется пока будет демо версия...

Спустя 3 минуты, 23 секунды (11.05.2007 - 14:24) coder написал(а):
Ответ MySql на создание таблицы для полнотекстового поиска:
#1214 - The used table type doesn't support FULLTEXT indexes
Запрос:
Код
CREATE TABLE articles(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY ,
title VARCHAR( 200 ) ,
body TEXT,
FULLTEXT (
title,
body
)
)

Спустя 12 дней, 19 часов, 25 минут, 44 секунды (24.05.2007 - 09:50) cage написал(а):
А какой тип долбиц у тебя по дефолту?случаем не InnoDB?

Спустя 2 года, 1 месяц, 12 дней, 1 час, 58 минут, 52 секунды (6.07.2009 - 11:49) Gabriel написал(а):
#1214 измени тип дб FULLTEXT поддерживает только MyISAM.

Спустя 36 минут (6.07.2009 - 12:25) PandoraBox2007 написал(а):
Цитата (Gabriel @ 6.07.2009 - 08:49)
#1214 измени тип дб FULLTEXT поддерживает только MyISAM.

или Сфинкс

Спустя 8 месяцев, 26 дней, 20 часов, 56 минут, 10 секунд (3.04.2010 - 09:21) linf написал(а):
FULLTEXT- медленный, если база большая, используй SELECT, так результатов будет меньше, но зато все будут удовлетворять точным запросам. (напрмер такой поиск ВКОНТАКТЕ, попробуй ввести часть имени или песни - ничего не выдаст!)

Что касается алгоритма.
1. сначала собирай все, где встречается 1ое слово
2. потом в результатх где есть второе слово +100 каждому
3. где есть третье +1000
...итд

далее сортируй этот массив по рейтингу балов, и от большего к меньшему и выводи

Спустя 2 часа, 10 минут (3.04.2010 - 11:31) Nikitian написал(а):
Велосипед, который изобретал когда-то. Потом отказался, т.к. сфинкс всё-же лучше, но если нет возможности установить, то можно и так.

Разбиваем текст на слова, удаляем незначащие: предлоги, местоимения, междометия, наречия, можно глаголы. Что осталось прогоняем через стеммер и сохраняем в табличку: crc32(word), postid.
Таким образом накапливается база для поиска. При поиске разбиваем запрос на слова, удаляем те же незначащие, остальное стеммером и делаем поиск по имеющейся табличке для всех полученных словоформ, прогнанных через crc32(). В результате получим список постов, где встречаются данные слова. Есть проблемы с релевантностью.
Почему crc32? Получаем немалую таблицу с 2 интовыми полями - поиск по ней очень быстрый. Про немалость: при тестировании полсотни постов породили таблицу в 10^6 записей.

Спустя 10 минут, 10 секунд (3.04.2010 - 11:41) sergeiss написал(а):
Археологи!!! Когда даете советы, то хотя бы иногда на дату создания темы смотрите, и на даты предыдущих ответов!!!

Спустя 6 месяцев, 3 дня, 14 часов, 20 минут, 54 секунды (7.10.2010 - 02:02) linf написал(а):
Цитата (sergeiss @ 3.04.2010 - 12:41)
Археологи!!! Когда даете советы, то хотя бы иногда на дату создания темы смотрите, и на даты предыдущих ответов!!!

Просто все так захотели помочь biggrin.gif

Спустя 30 минут, 8 секунд (7.10.2010 - 02:32) inpost написал(а):
sergeiss
А для меня - в самый раз! Я как раз сегодня о поиске подумал, никогда ранее не делал =) Каждый заказчик отказывался в конце! Глупые обстоятельства +)


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.