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

PartizaneN

I speak PHP
2 алл у меня порядка 2000 страниц.... И единственное, что у меня действительно тормозит - это индексация(ваще ужас какой-то), которую буду на С переписывать.... Я хочу только знать, какими функциями еще можно искать (кроме preg_match_all() и stristr()). Вот.
 

Silent

Новичок
>Я очень сильно сомневаюсь что у тебя опыт в программировании больше чем у меня

И правильно делаешь:) Я не программист, но иногда балуюсь написанием поисковиков. Хобби у меня такое.

Первая версия готова. Учитывая то, что это фактически мой первый скрипт на ПХП (до этого я писал только на Перле), там еще много чего можно оптимизировать. Особенно работу с массивами, видимо я чего-то в них недопонял, в Перле все было гораздо прозрачнее. При запросах, на которые находится больше 5000-7000 страниц, у меня дома начинает подтормаживать, поэтому в таких случаях я пока обрываю работу скрипта, до выяснения всех обстоятельств и дальнейшей оптимизации кода.

Тестировать можно тут: http://risearch.org/rus/risearch_php/search.php

Я надеюсь, вы понимаете, что это только рыба, поэтому на глюки внимание пока обращать не стоит, все еще будет переделываться и тогда выложу исходники.

О текстовой колекции: проиндексирован свободно доступный набор текстовых документов "TREC-5 Сonfusion Тrack". Колекция состоит из 55631 документа общим объемом 427 мегабайт (245 мегабайт после удаления тегов). Она состоит из официальных документов, изданных United States Government Printing Office в 1994 году. Большинство документов достаточно маленькие, иногда всего несколько строк, но встречаются и большие.

P.S. Все, я спать. Если будут вопросы, отвечу ближе к вечеру по московскому времени.
 

Vinny

Guest
Хм, а у меня на www.titles.ru и на faq.saterenko.ru поиск работает быстро. Он без морфологии, просто индексирует все слова, которые встречаются в тексте. Сейчас там 3,5 метра текстов и порядка 235 000 слов. Ищет достаточно быстро. По фразе "бен ладен" выдает порядка 100 новостей и все это выполняется за 1-2 сек с выводом. Сервак совсем не выделенный, valuehost. Тесты и индексы хранятся в базе.

Либо я гоню, либо я что-то не понимаю :)
 

kim

Guest
Автор оригинала: Vinny
Хм, а у меня на www.titles.ru и на faq.saterenko.ru поиск работает быстро. Он без морфологии, просто индексирует все слова, которые встречаются в тексте. Сейчас там 3,5 метра текстов и порядка 235 000 слов. Ищет достаточно быстро. По фразе "бен ладен" выдает порядка 100 новостей и все это выполняется за 1-2 сек с выводом. Сервак совсем не выделенный, valuehost. Тесты и индексы хранятся в базе.

Либо я гоню, либо я что-то не понимаю :)
А новость у тебя большая по объему? Представь кусок текста на пару метров - это всего лишь один документ. Таких документов очееень много. И когда ты вводишь фразцу для поиска, хочется, чтобы, все слова фразы были в одном предложении, например =)
Одно дело "простой" поиск, другое дело - балансирование на тонкой грани пертинентности и релевантности результатов поиска по объемным текстовым документам.
 

alex_great

Guest
To Silent:

опиши пожалуйста вкратце алгоритм индексирования и структуры которые хранишь, а также как их хранишь, основные идеи если можно
 

Vinny

Guest
2 kim:
Тесты не большие. Да и от размера текста время поиска никак не зависит, ведь поиск осуществляется по индексу, а не по тексту. Долго идет индекссирование, что непосредственно к поиску никакого отнеошения не имеет...
 

SeazoN

Guest
Не совсем потеме:
Посвящается любителям понажимать рефреш при поиске ;-). Результат найденного в индексе заносится в кэш.
Смысл - не дёргать индекс каждый раз.
 

[VS]

Guest
На приведенной странице ввел строку

"where and other people go for the key press alternative rule so that another one lost and found search criteria"
с типом поиска "AND".

PHP:
get_results() took 7.9574199914932 sec.
Script found more than 7000 files. Execution of script aborted.
Search took 7.9576170444489 sec.
т.е. 8 секунд на поиск который почему-то нашел ВСЕ. Почему-то я сомневаюсь что все эти слова присутствуют во всех текстах.
 

[VS]

Guest
твой поиск на
http://risearch.org/rus/risearch_php/search.php
мне очень сильно напоминает поиск на
http://risearch.org/

это так и должно быть?
 

kim

Guest
Автор оригинала: Vinny
2 kim:
Тесты не большие. Да и от размера текста время поиска никак не зависит, ведь поиск осуществляется по индексу, а не по тексту. Долго идет индекссирование, что непосредственно к поиску никакого отнеошения не имеет...
Время поиска слова в индексе - согласен, что зависит не оч. существенно от объема текста, но зависит от объема всей базы текстов.
Кроме того, речь идет о поиске расстояний - тут же есть зависимость от частоты слова в тексте, так как помимо самого факта наличия слова нужно либо хранить еще и расстояние до ближайших соседей, либо же в отобранных по наличию слов текстах вычислять расстояния.
Имхо для субжа лучше модуль интерфейса к поиску написать.
 

Vinny

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

Silent

Новичок
> опиши пожалуйста вкратце алгоритм индексирования и структуры которые хранишь, а также как их хранишь, основные идеи если можно

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

>Результатов поиска там не видно.

А что же там видно? Там приводятся номера документов. Если есть желание проверить, скачай эту колекцию текстов (она есть в инете) и проверь. Закачивать 400 мегабайт мне некуда. Просто я уже давно для проверки поиска использую этот набор документов, и в этот раз мне тоже было удобнее и использовать уже готовый набор.

> На приведенной странице ввел строку...

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

> мне очень сильно напоминает поиск на http://risearch.org/

А что здесь удивительного? Или ты думал, что я за пару часов с нуля написал этот скрипт? Все уже было написано давно, вчера я всего лишь попытался портировать перловый скрипт на ПХП.

> хочется, чтобы, все слова фразы были в одном предложении

:) Хочется конечно, но реально это нужно только на ОЧЕНЬ больших сайтах. А для таких сайтов уже стоит подумать о более серьезном движке. Для средних сайтов (а я думаю, что большинство имеет менее 10000 страниц), вполне можно обойтись простым поиском. В любом случае, если нужно, есть большй выбор сишных движков.
 

alex_great

Guest
а почему не Б-дерево?

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

и типов хэширования на самом деле много, смотря какую ты выбрал хеш-функцию
 

[VS]

Guest
этой системе поиска абсолютно пофигу расстояние в тексте между словами? судя по тому что я увидел, она абсолютно безполезная.
 

[VS]

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

Silent

Новичок
Ну, когда я писал самую первую версию, про Б-деревья я просто не знал:). А хеш-таблица нормально работает, пока на скорость никто не жаловался, так что нет смысла переделывать.

Да, я все строю в памяти и в конце сбрасываю на диск. Для разумных объемов это оправдывается скоростью индексации и простотой кода. Ты пробовал строить индекс на диске? Какую скорость индексации при этом можно ожидать? У меня есть один код на Перле, там получилось примерно 10-15 Мб в минуту. И как строить сам индекс, если словарь писать на диск в дерево?

Вроде от хеш-функции тип хеширования не сильно зависит. Я использую обычное открытое хеширование - таблица плюс линейные списки.
 

[VS]

Guest
Еще очень интересно посмотреть на исходники. Есть подозрение что в процессе работы очень много всего загружается в память.
 

Silent

Новичок
> судя по тому что я увидел, она абсолютно безполезная.

Этого следовало ожидать. Вот твоя фраза с предыдущей страницы: "PHP не предназначен для индексирования, поиска по индексам и для многих других вещей, например для мат. методов. PHP жуткий тормоз в этом.". Там нигде не упоминается релевантность. Когда я за пару часов написал поиск по индексу, ты сразу начинаешь говорить, что так конечно можно, но тебе нужна релевантность. Найдется немало людей, которых устроит поиск без релевантности, лишь бы не мучиться с настройкой mnogosearch.

А какая разница, что и сколько загружается в память? На это ты никаких условий не ставил. Или ты думаешь, что Mmnogosearch и MySql, которых ты обычно советуешь, совсем не требуют памяти?
 

[VS]

Guest
Я спросил - сколько загружается в память. Если для каждого поиска это несколько метров то уже фигово.

Я не обсуждал написание примитивнейшего поиска по простейшему индексу, который никому не нужен из-за того что он ничего не может.
То что ты написал - это не поиск по индексу, а нахождение страниц содержащих определенные слова.
Поиск должен анализировать расстояние между словами, иначе он нафиг не нужен.

Если кто-то не в состоянии настроить mnogosearch то никто не мешает использовать поиск из гугла.
 
Сверху