Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   поиск по сайту (статические страницы) (http://forum.oszone.net/showthread.php?t=43684)

mar 12-01-2005 00:42 287711

поиск по сайту (статические страницы)
 
собственно, subj
имеется сайт. на нем куча статей (статика). Народ просит поиск, может быть придется заняться.
варианты:
1)- переводим статику в php+база, пишем движек для добавления нового (ну, и чтения старого, естественно :) (может быть не пойдет по многим причинам, одна из которых - не хочу лишать куска хлеба тамошнего webmaster-а :))
2)- делаем индексацию и скрипт переиндексации. Webmaster, кдадя очередную статью запускает скрипт и идет переиндексация базы.
2-1- вопрос: как лучше хранить индексы? в текстовом файле-словаре, или в БД?
2-2- если в бд, то в принципе возможно не переиндексация, а доиндексация. Идеи?
3)- делаем просто перевод текста статей в бд и используем полнотекстовый поиск mysql (кто что хорошего-плохого мог бы о нем сказать?) Делаем скрипт, при запуске которого идет добавление текста новой статьи в БД.

Кому какие идеи нравятся/не нравятся? Какие еще идеи?
Спасибо :)

Vlad Drakula 12-01-2005 00:51 287713

mar
я бы делал так:
1) берем страницу
2) выризаем в ней теги
3) создаем список слов встретившихся на этой странице (все повторяющиеся выкидываем)
4) заносим в базу
5) неплохо бы сделать фул индекс на это поле.

mar
но это все так... теория... тут очень много значит размер сайта и то как часто будут пользоваться поиском...

mar 12-01-2005 01:01 287715

Vlad Drakula
ну то есть тебе нравится путь
Цитата:

- делаем индексацию
c использованием базы? + полнотекстовый поиск, что даст возможным отслеживать словофоры?
Размер... Большой там размер. (Правда картинок много, - это я размеры каталоговсмотрю, - но и текста полно. Причем ведь еще напишут :))

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

Добавлю, пожалуй, пункт 4:
- гибрид 2+3 : то есть храним и словарь и весь текст (интересно, а база не рухнет... :))


Vlad Drakula 12-01-2005 01:18 287718

mar
все зависит еще и от сервера...
500-1000 мб текста это не так много!

mar 12-01-2005 01:23 287719

сейчас они сидят на nodex-е ;)
О своем серваке думают, но, видимо, где-то через год (по финансовым соображениям,- им сейчас не до того).

archy 12-01-2005 09:16 287775

mar
может mnogosearch спасет?

mar 12-01-2005 09:28 287781

archy
может быть :) Ты с ним дело имел?

archy 12-01-2005 10:33 287801

нет, но не думаю, что там могут быть сложности... можно и htdig испытать

mar 12-01-2005 12:37 287840

archy
на хостинге могут :( - когда поставить нельзя. О! супер phpinfo() выдало
Цитата:

--with-mnogosearch=/usr/local/mnogosearch
(второй возможный облом на чужем хостинге может быть с кодировками - сайт на cp1251. Я тут на днях развлекалась postgres-ом для извращенцев - работе под win. В результате все удалось, даже upper/lower заработали и словари в tsearch2 удалось подключить, но эмоций была масса ;))
так что уже имеется и в php вкомпилен. Пойду почитаю документацию :)

Тогда еще один вопрос:
- пункт 6 за и против mnogosearch

vadimiron 12-01-2005 12:41 287842

А может самому ничего не писать, а воспользоваться внешним поисковиком??
Например Google
Делаем форму, и запрос поиска посылаем сайту Гугла, я такое на многих сайтах видел.
Можно обрабатывать страницу результатов Гугла, чтобы под свой дизайн подогнать, так как у этих страниц стандартная разметка
По моему такое решение наиболее быстрое, нетребовательное к собственным ресурсам и наиболее гибкое

Vlad Drakula 12-01-2005 15:20 287888

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

mar
главное чтобы поиск работал не так как на IXBT , а то там второй запрос поиска кладет базу нафиг...

mar 12-01-2005 23:33 288027

vadimiron
тот же гугль на втором шаге поиска вынесет на свои страницы. Помнишь, как в конце жизни старого движка осзона было? Что не есть гут :)
Vlad Drakula
:) ну я пока только прикидываю. Тот же mnogosearch на том же nodex-е стоит, но, насколько я понимаю, один на всех. Попросила webmaster-а сайта списаться с техподдержкой и узнать, как к нему обращаться
А полнотекстовый поиск на mysql интересен, но боюсь, не тяжел ли в обращении... (никогда с ним не работала, так что своего +/- опыта нет)

Vlad Drakula 12-01-2005 23:44 288030

mar
в принципе там ничего сложного вроде нет...
кстати раз тебе больше нравится постгри, так может его использовать будешь а не MySQL ?
(доплата коло 0,5$ в месяц)

тяжелость выясняется на предварительных тестах....

mar
всекогда то в первый раз!!!

mar 12-01-2005 23:57 288035

Vlad Drakula
тяжесть в обращении - имелось в виду не написание запросов, а загрузка сервака :tongue:
по поводу постгреса, - у меня там на mysql (делалось под предыдущего хостера) крутится форум с поиском, страницы юзеров (клуб при форуме), записные книжки юзеров (при том же форуме) и некоторый задел для идей, которые пока озвучены, но не заказаны. Миграция на постгрес на боевом серваке с достаточно большой посещаемостью и к тому же коммерческими обязательствами, - мне, пожалуй, при всем любви к нему (постгресу то бишь :)) - не улыбается :shuffle:

Vlad Drakula 13-01-2005 00:54 288048

mar
а зачем мигрировать... можно использовать и то и другое... т.е. иметь и MySQL И постгрее....

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

mar 13-01-2005 01:04 288049

ну, быстрее все-таки все вместе хранить (скажем, чтобы тот же поиск и по сайту и по форуму разом шел)
Может, я когда-нибудь все на постгрес там и переделаю, но только после того, как у них будет выделенный сервак (а у меня - время :(). Хочется, если уж использовать возможности нормальной :) СУБД, то и тюнинг там делать такой, какой захочется


mar 14-11-2005 02:11 373612

значит так :)
хотела написать - "не прошло и пол года", но пол года с тех пор уже прошло. Выдался свободный день, сделала таблицу с индексом по fulltext, скрипт, загоняющий в нее данные статических страниц и поиск к этому делу. Запрос элементарный:
Код:

SELECT url, title, MATCH (text) AGAINST ('.....то, что запросили...')  AS relevant
                                FROM full_text
                                WHERE MATCH (text) AGAINST ('.....то, что запросили...')

Двойной запрос MATCH (text) AGAINST, судя по dev.mysql.com, выполняется 1 раз, но зато выстраивает ответ по релевантности, отсекая 50% границу. Короткие слова, слова частовстречающиеся не индексируются. Если слово встречается на всех страницах многократно, оно игнорируется. Работает, на мой взгляд весьма быстро (хотя объем относительно неболшой - весь текст уложился в 11-12 Мб): запрос отыгывает за <= 1 мсек. В общем, мне нравится :)
Посмотреть настройки MySQL, касаяющиеся полнотекстового поиска можно:
Код:

SHOW VARIABLES like '%ft%';
Статьи:
http://dev.mysql.com/doc/refman/4.0/...xt-search.html - документация по 4.0 на русском
http://dev.mysql.com/doc/refman/4.1/...xt-search.html - документация по 4.0 на английском
http://xpoint.ru/know-how/PHP/GotovyieResheniya/Poisk?1 - "Поиск по сайту" - пример скрипта-индексатора сайта

Vlad Drakula 14-11-2005 12:37 373728

mar
я пробовал fulltext, в каталоге программ он вел себя не лучьшим образом, по этому мне пришлось писать свой собственный поиск + свою собственную индексацию.

mar 14-11-2005 14:38 373782

Vlad Drakula
ну, индексатор и поиск мне тоже писать пришлось =) Я просто показала запрос, покрывающий бОльшую часть потребностей посетителей сайта. В принципе мне приходилось писать и разные поисковые системы, но в данном случае fulltext мне действительно понравился. (Посмотрим, правда, что скажет тестирование) Вопрос к тебе - можешь поподробней написать, что именно тебя не устроило? Если можно с примерами. (Может, есть какие-то незамеченные мной грабли)

Vlad Drakula 14-11-2005 14:43 373785

mar
ну... мне он полностью не подошол!

fulltext ищет только слова целиком, а мне нужно было чтобы и части слов искал.

mar 14-11-2005 14:57 373793

Vlad Drakula
Цитата:

Звездочка является оператором усечения. В отличие от остальных операторов, она должна добавляться в конце слова, а не в начале.
пример:
apple*

... ``apple'', ``apples'', ``applesauce'', и ``applet''."
только у меня что-то не отрабатывает ни в русском, ни в латыни, вернее отрабатывает криво - вываливает все с релевантностью 0 :(
Попробую разобраться

mar 14-11-2005 15:04 373796

Кажется, нашла:
Цитата:

SELECT uri, title,
MATCH (text) AGAINST ('apple* fruit*' IN BOOLEAN MODE) AS relevant
FROM `search_index` WHERE
MATCH (text) AGAINST ('apple* fruit*' IN BOOLEAN MODE)
Вечером, попробую придумать что-нибудь более оптимальное для общего запроса.

Vlad Drakula 14-11-2005 15:08 373799

mar
а слово "biapples" оно найдет?

mar 15-11-2005 01:19 373976

Vlad Drakula
не найдет. Но мне, честно говоря, и не надо. Я сама чаще ищу слова без окончания, чем без приставок :)

В общем, сделано так:
Код:

    $search_text = $_POST['search_text'];
    $bool = false;
    if( (strpos($search_text, "*") > 0) ||
            (strpos($search_text, '"') > 0) ||
            (strpos($search_text, "~") > 0) ||
            (strpos($search_text, "+") > 0) ||
            (strpos($search_text, "-") > 0) ||
            (strpos($search_text, ">") > 0) ||
            (strpos($search_text, "<") > 0) ||
            ((strpos($search_text, "(") > 0) && (strpos($search_text, ")") > strpos($search_text, "("))))
                        $bool = true;

Дальше в случае $bool в запрос добавляется IN BOOLEAN MODE (см. выше)

Vlad Drakula 15-11-2005 12:36 374097

mar
Цитата:

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

mar 15-11-2005 12:59 374107

Vlad Drakula
ну, "у меня" сайт с немного совсем другой тематикой :)
Хотя, я бы, наверное, для случаев *слово (в отличие от слово*) написала один запрос, а остальное использовала бы as is - больно уж качественно и быстро работает (что, наверное, и должно быть - все-таки то, что делается средствами СУБД по скорости не переплюнуть :))

Vlad Drakula 15-11-2005 13:38 374120

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

archy 16-11-2005 09:39 374404

ispell после колдовства умеет выдавать словоформы. А чем mnogosearch не устраивает?

mar 17-11-2005 01:49 374712

archy
ispell вообще штука замечательная и прикручиваемая к tsearch2 (postgresql). mnogosearch - тоже хорошо, но скорей всего на своем сервере (то есть ближе к случаю Влада). А в том случае о котором я пишу исторически сложился mysql + статика. Опять же может быть загоняние статики в базу данных подстегнет народ к переходу на движек ;] Ну, а мне хртелось посмотреть, что за зверь такой mysql-ый fulltext :) Посмотрела - пока нравится.


Время: 18:58.

Время: 18:58.
© OSzone.net 2001-