Крутой поисковик!!!

Silent

Новичок
Загружается по два байта на URL для каждого слова, извини, меньше сложно. А уж сколько из них сделает ПХП для своих структур, мне не ведомо. Поиск так или иначе тяжелая операция, но на обычных сайтах не ищут по 5 раз в секунду.

Тебе не кажется, что это уже становится смешно? Сейчас мы найнем обсуждать, что есть поиск по индексу. Я с самого начала написал, что поиск будет без релевантности, ты ответил, что я его никогда не напишу. Если ты не можешь признать, что ошибся, я не обижусь. Отвечать на подобные вопросы больше не хочу.

P.S. Помниться мне, что в fido7.ru.php кто-то говорил про движок на ПХП с учетом позиции слова.
 

[VS]

Guest
То что ты написал - это НЕ поиск. Это нахождение количества слов в страницах.

Я не понял, у тебя все индексы загружаются в оперативку при поиске?
 

PartizaneN

I speak PHP
2 [VS] Да я тут немного свой поиск долелал... 10.000 страниц со свистом... Хоть 100 слов вводи... Только вот выместить не могу... хостинг глючит... Не ожидал я от пхп такой прыти...

2 Silent не мог бы ты не в службу, а в дружбу прислать мне свой исходник на [email protected]... plz...
 

Silent

Новичок
Загружается список URLов (один URL представлен двумя байтами), в которых есть заданное слово. Неужели можно сделать не загружая эту инфомацию?

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

2 PartizaneN: ну если у тебя 10000 страниц со свистом, то зачем тебе мой кривой скрипт на который я потратил всего несколько часов, большую часть из которых рылся в доках и искал аналоги перловых функций. Лучше расскажи как у тебя поиск устроен (исходники приветствуются:)).
 

[VS]

Guest
Silent: Исходник как я понял мы не увидем?
Поиск крайне странный, не дающий нужных результатов.

Можешь хотя-бы нормально обьяснить - что ты в память загружаешь?
 

Silent

Новичок
Каждое введенное слово ищется в словаре, если находится, загружается строка, где каждые два байта содержат номер документа, в котором есть данное слово. Самая простейшая схема, ее можно усложнять, но принципиально все поисковые движки так устроены.

Что есть нужный результат? Ты так и не дал опредения поиска. Лично для меня при поиске на сайте релевантность имеет дастаточно малое значение. При поиске в инете есть разница, будет нужный мне документ на первой странице или на 1000-ой. На среднем сайте редко бывает больше 10000 страниц и при поиске по редкому слову или по нескольким словам будет выдано не так уж много результатов. Найти нужный не составит труда. Если есть релевантность - хорошо, нет, ну и черт с ней, и так найду. Язык запросов тут на мой взгляд гораздо важнее, чтобы поиск хоть что-то выдал. То есть нужна либо морфология, либо поиск по началу слова. Мой движок по умолчанию ищет по началу слова, то есть на запрос "город" будут найдены все слова, начинающиеся на эти символы (если искать по точному совпадению, можно немного ускорить скрипт). Этого часто бывает уже достаточно, хотя морфология тоже есть, и в принципе ее можно прикрутить.

Для исходников время еще не пришло. Это мой первый скрипт на ПХП и вчера я был больше озабочен тем, чтобы это вообще заработало. Нужно еще разобраться со странными массивами в ПХП, логика которых мне пока недоступна.
 

[VS]

Guest
обьясни как устроен словарь и как ты с ним работаешь, подробно пожалуйста.
Так-же - какое железо на сервере, размер индекс файла, и.т.д.
 

clevel

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

Silent

Новичок
Там все достаточно просто, если не сказать примитивно: строится хеш-таблица (примерный код я совсем недавно тут кидал). При запросе вычисляется хеш-функция от запрошенного слова, идем в хеш-таблицу, fseek-ом перемещаетмся на hash_value*4, читаем 4 байта, если это 0 - такого слова нет. Если не нуль, там будет смещение для начала линейного списка. Опять перемещаем указатель на нужное место, читаем "4+x" байтов, где в первых четырех байтах должно быть смещение следующего элемента списка (если нуль, значит этот элемент последний). В остальных "х" байтах лежит некая информация о данных (например это может длина слова и длина списка документов, зависит от того, что, как и где хранится). Читаем слово, сверяем с запросом, если подходит, читаем список документов, в которых есть это слово. И так далее. Затем над списками Doc_ID проводятся требуемые множественные операции (объединение, пересечение). Считывание данных происходит достаточно быстро, нет особого смысла это оптимизировать (пока число документов не превышает, скажем, 100000). Основное время тратится на обработку списков Doc_ID. И если делать с релевантностью, с учетом расстояния между словами, тогда придется повозиться.

Размер индеса зависит от многих данных. Для того набора документов, что я использовал, получилось около 50 Мб, из них 16 - это описание документов, список слов - 3 Мб (400000 различных слов).

А про сервер я понятия не имею. Работает и работает, какая мне разница? Не мой ведь:)
 

PartizaneN

I speak PHP
2silent кинь еще раз... уж больно интересно, как ты строишь хэш табло... И... не пытайся влезть в дебри перла через пхп.
 

alex_great

Guest
вообще-то строить на диске хеш-таблицы есть хорошие алгоритмы, в памяти делать все - не есть хорошо, но все равно молодец, только вот про mysql ты зря - использовать готовую базу разумнее и эффективнее, тебе бы не надо было строить хеш-таблицу или Б-дерево (что как правило лучше), потому что mysql сам все это хорошо делает или применил бы Berkley DB если тебе так уж не нравятся реляционные базы, там хорошо реализованы алгоритмы чтения записи по ключу.

а что вы понимаете под релевантностью, определение тематики или что?
 

kvn

programmer
Есть статья в и-нете называется примерно "Быстрый поиск - алгоритмы.."

Сейчас УРЛ не помню, но если надо могу посмотреть...(у меня она где-то лежит напечатаная)
 

kvn

programmer
Алгоритмы: «умный» поиск в тексте
Игорь Бобак

http://www.programme.ru/archive/2002/6/062002_6.phtml

советую, довольно интересные подходы описаны:

- Алгоритм Кнута, Морриса и Пратта (КМП)
- Поиск подстрок с помощью конечных автоматов
- Алгоритм Рабина-Карпа (РК)
- Алгоритм Бойера-Мура (БМ)
- Алгоритм Shift-And

Причем приводится сравнительная характиристика, тесты, выводы, и куски кода на паскале.

Удачи.
 

Silent

Новичок
To [VS]:

Ок, убедил. Готов согласиться, что релевантность не так уж плоха, хотя по преднему считаю, что для небольших сайтов ее роль не слишком велика. Но все равно сегодня написал новую версию (на Перле, поскольку его лучше знаю). Посмотреть можно тут:

http://risearch.org/cgi-bin/demo/pro_dist/search.pl

Была проиндексирована документация на ПХП и Перл (3500 документов, 20 Мб). При поиске учитывается как число слов в документе, так и расстояние между ключевыми словами (там наверное нужно еще с коэффициентами поиграть для улучшения результатов, но и так работает). Размер индекса правда сильно вырос (9 Мб, то есть почти 50% от исходных данных), но меня сейчас больше волновал вопрос скорости доступа к данным, поэтому в индексе есть избыточная информация.

To PartizaneN:

Код хеш-таблицы я кидал сюда: http://phpclub.net/talk/showthread.php?s=&threadid=25325&rand=17. Он на Перле, но там все функции имеют прямые аналоги в ПХП, поэтому проблем быть не должно.

>И... не пытайся влезть в дебри перла через пхп.

Тут видишь какая проблема, в дебри Перла я залез достаточно давно... И не хочу вылезать, нравится мне там.

To alex_great:

Это сложный вопрос, причем решать его нужно начиная с постановки задачи. Свой поиск я писал для ныне заброшенного сайта http://bukinist.agava.ru/, причем вся инфа у меня была на локальном компьютере, ее не нужно было выкладывать на сайт, а поиск нужен на сайте. Значит нужна переносимость индекса. Если я правильно понял, ни MySQL, ни Berkley DB переносимость гарантировать не могут. В инете я ничего подходящего по мощности не нашел, пришлось самому писать. А вообще, поисковый индекс и реляционные базы мало совместимы. Не нужны богатые возможности базы для этого индекса. И ни одна большая поисковая система не хранит индекс в базе. Хотя для небольших объемов это может работать, и даже быть удобным из-за легкости реализации динамического индекса.

При построении хеш-таблицы прямо на диске возникают проблемы с построением индекса. Словарь то легко обновлять, а вот как писать индекс, который должен расти? Придется делать его блочным, но тогда появятся дырки. Если блоки малы, скорость поиска будет тоже мала. При больших блоках индекс займет много места. У меня есть скрипт, который делает индекс на диске. Тестировал его на 1.5 Гб данных. Если поиск возвращает порядка 10000 документов, все хорошо. Если 50000 и больше - тормозит.
 

sapenov

Guest
Автор оригинала: Silent


.... А вообще, поисковый индекс и реляционные базы мало совместимы. Не нужны богатые возможности базы для этого индекса. И ни одна большая поисковая система не хранит индекс в базе. Хотя для небольших объемов это может работать, и даже быть удобным из-за легкости реализации динамического индекса.
ну почему же мало совместимы ?
взять тот же rambler... индексы лежат в базе (
подробности тут)
 

sapenov

Guest
[РАЗМЕРОМ=1] :))) сорри два раза запостил одно сообщение[/РАЗМЕРОМ]
 

Silent

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

P.S. Ашманов (бывший разработчик Рамблера) утверждает, что не используется там реляционная база. Подробности тут:
http://www.searchengines.ru/forum/showthread.php?s=&threadid=2365&perpage=15&pagenumber=2
 

PartizaneN

I speak PHP
2 silent... У меня на хостинге места не осталось.... А то я бы показал, как у меня 10000 со свистом... Ты случайно не пробовал делать как на гугле.... Чтобы все слова, которые нашлись отображались, а не только те, кот. еще более или менее радом стоят.... Надеюсь ты меня понял...
 

alex_great

Guest
to kvn те алгоритмы что ты привел известны любому нормальному программисту, они предназначены для нахождения подстроки в строке, но для поиска это нафиг не нужно )

что значит плохая переносимость?

тебе самому создать те механизмы работы с индексами которые есть в том же mysql будет нелегко, по крайней мере одному да и не зачем

большие поисковики имеют приличные и опытные команды, специалисты по поиску
 
Сверху