Поисковик на MySQL + PHP :)

Wicked

Новичок
Поисковик на MySQL + PHP :)

Тред поднимаю с целью оценки народом существеющего поисковика на MySQL + PHP и выяснения его перспектив.

Он обладает такими возможностями.

Плюсы:
1) Опциональный учет морфологии на Ispell.
2) Опциональный режим работы с фразами (т.е., можно сказать, учет позиций слов).
2.1) Поиск фраз в строгом порядке следования слов.
2.2) Поиск фраз в любом порядке следования слов.
2.2.1) Поиск фраз, когда некоторые из слов, содержащихся в них не найдены.
2.2.2) Поиск фраз, когда в тексте внутри них встречаются посторонние слова.
3) TFxIDF ranking
4) Задача поиска многих терминов внутри одного текста (полезная фича для классификации текстов)...
5) 99% работы выполняет MySQL сервер.

Минусы:
1) Не приспособлен к изменяющемуся контенту (нужно запускать полное переиндексирование)
2) Большой объем индексных файлов (таблицы инверсного индекса, таблицы статистики, mysql-индексы).
3) Т.к. я рассматриваю саму задачу поиска "чего-то" в "чём-то", то я не заботился о пользовательских интерфейсах, выводах результатов и т.д. и т.п.

Скорость работы пока что никуда относить не буду, т.к. оно depends on ..... %)

Основной принцип работы у него такой:
Инсталляция:
1) В бд засасываются данные для Ispell, там из них генерятся все остальные словоформы.
2) С помощью них индексируются статичные данные: корпус текстов для поисковика либо список терминов для классификатора.

Использование:
1) Принимается запрос от клиента. Поисковый запрос в виде население "российской федерации", либо аплоадится файл, который будем классифицировать.
2) Запрос тоже индексируется. Для него получаем таблицу инверсного индекса, таблицу статистики и т.д.
3) Итого мы получили 2 инверсных индекса в базе данных, которые нужно сравнивать. Сравнение индексов на присутствие цепочек записей из одного индекса в цепочках записей в другом. Цепочка записей олицетворяет собой либо один текст, либо одну фразу из запроса. Кстати, прошу заметить, что в этом поисковике (именно в функции поиска) нету ни одного запроса к MySQL, который бы зависел от запроса :)

Если народу интересно такое обсуждение, я перестану лить воду и перейду к архитектуре и скриптам %)
 

Кром

Новичок
>Если народу интересно такое обсуждение, я перестану лить воду и перейду к архитектуре и скриптам %)

Давай, переходи. Мне интересно. Пару вопросов:
1. Чем он лучше существующих решений?
2. Он где нибудь уже работает, т.е. можно ли посмотреть не его функциональность в боевых условиях.
3. Есть ли готовый релиз и можно ли его скачать. Или это просто "концепция" + пару скриптов?
3. Есть ли документация?
 

clevel

Новичок
Меня интересует TFxIDF ranking и все, что связано с определением релевантности страниц в результатах поиска.
 

Wicked

Новичок
Originally posted by Кром 1. Чем он лучше существующих решений?
Нельзя ли поконкретней? Я периодически рыскаю в инете в поисках чего-нть похожего, но из похожего наткнулся только на подобный проект из последней пхп-конференции.
По сравнению с ним у меня такие приемущества:
1) инверсный индекс у меня хранит не сами слова, а их идентификаторы, что должно сказаться на скорости в положительную сторону.
2) у меня есть учет фраз.
3) там учет морфологии тоже опциональный, но, если я не ошибаюсь, требует полной переиндексации. У меня полной переиндексации не требует.
4) у меня используется TFxIDF ranking. Там тоже можно назначать веса словам, но это требует доп. усилий со стороны девелопера.
5) Я попытался как можно больше абстрагироваться от PHP и возложить по максимуму работу на MySQL. MySQL все таки скомпиленная прога и должна ворочаться побыстрее :)
И это позволяет с наименьшими усилиями перейти например на Perl+MySQL и т.д. PHP используется по большей части как инструмент для запуска MySQL-запросов.
6) возможность классификации текстов (т.е. ее решение ее подзадачи - нахождения всех терминов в некоем тексте. Дальше девелопер должен сам использовать эту информацию, чтобы на основании найденных терминов вынести вердикт о том, к какой рубрике относится этот документ).
7) ...

По сравнению со всякими MnogoSearch'ами, моя конечно уступает по производительности, по возможностям и т.д. и т.п., зато не требует постороннего софта кроме PHP+MySQL.
Кстати, оно работает даже на MySQL 3.23.xx.

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

Originally posted by Кром 2. Он где нибудь уже работает, т.е. можно ли посмотреть не его функциональность в боевых условиях.
Оно крутится у меня на локалхосте в качестве поисковика по энц. словарям с объемом информации около 96 мбайт (194000 словарных статей). Как ты понимаешь, в инете оно недоступно %)

И как классификатор математических текстов с базой в 30-40 тыс. терминов. Как раз доделываю фронт-енд для этого дела. Скоро будет доступно в Интернете.

Originally posted by Кром 3. Есть ли готовый релиз и можно ли его скачать. Или это просто "концепция" + пару скриптов?
О релизе как таковом можно говорить применительно только к файлу, в котором прописаны классы. Под каждую конкретную задачу есть 3 скрипта для инсталляции (инсталляция ispell, закачка статичных текстов, индексация статичных текстов) + n скриптов для использования.

Originally posted by Кром 4. Есть ли документация?
Нету :)

-~{}~ 05.01.05 12:24:

Originally posted by clevel
Меня интересует TFxIDF ranking и все, что связано с определением релевантности страниц в результатах поиска.
Тебе интересен сам принцип работы TFxIDF? Это можно найти на гугле/яндексе. Это, можно сказать, алгоритм. И он везде одинаков, только реализации разные.

Или то, как оно сделано у меня?
Одной из промежуточных таблиц во время работы моей системы является таблица (1), в которой содержится информация, сколько раз каждая фраза встретилась внутри каждого текста.
На основании этого одним запросом мы получаем таблицу (2) с информацией об IDF для каждого термина.
А другим запросом - джоиня (2) с (1) - таблицу с информацией об TFxIDF для каждого документа. Далее просто упорядочиваем по этому полю.
 

ONK

Пассивист PHPСluba
Интересно было бы посмотреть на эту штуку в работе.
 

Wicked

Новичок
Я сегодня вечером-ночью постараюсь выложить скрипты + небольшую инструкцию по установке. Каждый сможет попробовать.

-~{}~ 06.01.05 00:58:

Вот, небольшой архивчик со снэпшотом положил тут.
http://development1.key-soft.net/wicked/ENC11_release.rar
423,186 bytes.
Там же сразу подготовленный словарь для ispell.

Перед работой прошу всех ознакомиться с содержимых скриптов. Распространяется As Is. Вы используете эти файлы на свой страх и риск! :)

Порядок действия такой:
- в settings.php задаем правильные настройки, создать бд в mysql.
- запустить install.php. Это создаст все таблицы, необходимые для ispell, наполнит их, сгенерирует все словоформы. (требует около 70..80 мбайт на винте + полчасика времени :))
- запустить enc11_importer_bench.php. Это создаст таблицы для тектов и засосет 4 текста по 6 кб - тестовые данные (я тестировал на 6..100 мбайт).
- запустить enc11_indexer.php. Он создаст таблицы для инверсного индекса корпуса текстов и проиндексирует его.
- сам поиск - index.php
 

clevel

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

fisher

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

>>3) там учет морфологии тоже опциональный, но, если я не ошибаюсь, требует
>>полной переиндексации.
не совсем - в одном из вариантов в индексе хранятся неприведённые слова. но, если уж решили хранить приведенные формы - то увы, иначе никак

вообще, очень не хватает open source поисковика просто на си безо всякой внешней базы - вообще. сделать подобный _нормальный_ проект - задача очень трудоемкая и поэтому в ближайшее время вряд ли осуществимая - но имхо рано или поздно такие решения должны появиться, поскольку востребованность задачи быстрого поиска будет только расти.
 

Wicked

Новичок
Если кто не в курсе, fisher - это и есть докладчик по этой теме с последней PHP-конференции, на чей доклад я и ссылался.

Originally posted by fisher
>>наткнулся только на подобный проект из последней пхп-конференции.
>>По сравнению с ним у меня такие приемущества
ну, вообще говоря, это никакой не проект, а всего лишь некий рецепт. поэтому сравнивать их не совсем корректно.
Ну если твой не проект, то и мой тогда тоже... :) я имел в виду, что наши разработки - примерно одного ранга...

Originally posted by fisher
>>3) там учет морфологии тоже опциональный, но, если я не ошибаюсь, требует
>>полной переиндексации.
не совсем - в одном из вариантов в индексе хранятся неприведённые слова. но, если уж решили хранить приведенные формы - то увы, иначе никак
Ну в более общем случае, когда хранятся неприведенные слова, наверное довольно сильно падает скорость при поиске с учетом морфологии... В другом бранче своей системы я храню одновременно и неприведенные слова, и приведенные формы (хотя кому-то этот способ может показаться неэкономичным в плане дискового пространства), а точнее их идентификаторы...
Originally posted by fisher
вообще, очень не хватает open source поисковика просто на си безо всякой внешней базы - вообще. сделать подобный _нормальный_ проект - задача очень трудоемкая и поэтому в ближайшее время вряд ли осуществимая - но имхо рано или поздно такие решения должны появиться, поскольку востребованность задачи быстрого поиска будет только расти.
Си это конечно хорошо, но тоже не панацея... На некоторых хостингах у тебя не получится запустить бинарный исполняемый файл, в то время как php+mysql заработают...

Эхх..... :) Где бы взять исходники google desktop search'а? %)
 

svetasmirnova

маленький монстрик
Originally posted by fisher
вообще, очень не хватает open source поисковика просто на си безо всякой внешней базы - вообще. сделать подобный _нормальный_ проект - задача очень трудоемкая и поэтому в ближайшее время вряд ли осуществимая - но имхо рано или поздно такие решения должны появиться, поскольку востребованность задачи быстрого поиска будет только расти.
А каким он должен быть?
Wicked
Извините, ваш проект ещё не успела посмотреть.
 

Wicked

Новичок
Небольшой патч:
1) В классе для поиска без возможности поиска фраз - shc_simple - теперь применяется настоящий TFxIDF вместо простого TF :)
Кстати, я бы порекомендовал именно на этом классе вникать в работу этих классов.
2) class.php переехал в class_assert.php. Сам class.php теперь другой, имхо получше %) Они отличаются классом shc(), который в обоих случаях дает одинаковый результат, но получают они их разными методами )
3) Немного улучшены комментарии.
4) Теперь таблицы (пере-)создаются непосредственно перед их заполнением.

http://development1.key-soft.net/wicked/ENC11_patch_1.01.RAR

-~{}~ 10.01.05 23:35:

Народ, с какой части начать повествование в документации? - Архитектура
- Использование Ispell (морфология)
- Процесс индексации
- Поиск вхождений
- Релевантность
Что из этого вы хотите, чтобы я описал в первую очередь? (Список можете дополнить)
 

svetasmirnova

маленький монстрик
Да в том же порядке:

Архитектура
(на первом месте)

дальнейшее одинаково интересно
 

Кром

Новичок
У меня вопрос, поддержка mysql 4.1.x планируется?
Я кое как запустил все это дело на 4.1, но результаты поиска все время равны нулю.
Там лишние запятые в большинстве файлов типа c_query_nfs.sql
>PRIMARY KEY (`SUPERSEQ_FK`, `TERM_FK`),

Потом classes.php
строка
>$query = "insert into ?TEMP_NUM? (NUM) values ('".join("'),('", range(0, $maxlen-1))."')";
Ругается на дублирующие ключи.

Ну и естественно - кодировки.

Да, еще. Если запускать файл install.php при error_reporting(E_ALL) - скрипт просто впадает в кому.
 

Wicked

Новичок
Кром, спасибо за тестинг :)
Originally posted by Кром
У меня вопрос, поддержка mysql 4.1.x планируется?
Я кое как запустил все это дело на 4.1, но результаты поиска все время равны нулю.
Надеюсь. Я как раз на днях скачал 4.1.7. Буду пробовать.

Originally posted by Кром
Там лишние запятые в большинстве файлов типа c_query_nfs.sql
>PRIMARY KEY (`SUPERSEQ_FK`, `TERM_FK`),
Наверное ужесточили требования в 4.1.х. Исправлю.
Originally posted by Кром
Потом classes.php
строка
>$query = "insert into ?TEMP_NUM? (NUM) values ('".join("'),('", range(0, $maxlen-1))."')";
Ругается на дублирующие ключи.

Странно... эта таблица должна пересоздаваться перед каждым заполнением (именно так у меня и происходит).
PHP:
$query["TEMP_NUM"] = array(
"CREATE" => true,
"TABLE_NAME" => "TEMP_NUM",
"PRE_DROP" => true,
"FILE" => "QUERIES2/c_temp_num.sql",
//"DROP_AFTER" => "SUBQUERY4",
);
Может это не так и в ней остаются предыдущие записи? Или range генерит повторяющиеся, что маловероятно :)
Наверное стоит написать [SQL]insert ignore ...[/SQL]

Originally posted by Кром
Ну и естественно - кодировки.
Да, еще. Если запускать файл install.php при error_reporting(E_ALL) - скрипт просто впадает в кому.
Ы :) С кодировками вообще сплошная морока... По идее, надо сделать так, чтобы каждый девелопер мог перенастроить под свою, соответствующую кодировке базы данных. Я старался перенести всю работу со строками на базу данных, чтобы не нужно было синхронизировать локали/кодировки в PHP и MySQL между собой, но все еще остался один preg_replace, который занимается разбивкой индексируемых текстов на слова.

А что, с error_reporting(E_ALL) ошибки вообще в вывод/логи не кидает?
А если попробовать error_reporting(E_ALL & ~E_NOTICE), может ему полегчает?
 

Кром

Новичок
>Надеюсь. Я как раз на днях скачал 4.1.7. Буду пробовать.

Ок.

>А если попробовать error_reporting(E_ALL & ~E_NOTICE), может ему полегчает?

Если убрать нотайсы база созадется и заполняется. Именно так мне и пришлось сделать. Но это не выход.
 

Wicked

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

asm

Пофигист
Fatal error: MySQL Error:
file:z:\home\search\www\class.php
class:mysql
function:mysql_query_sequence
line:126
error message:You have an error in your SQL syntax near ') TYPE=HEAP' at line 5
query:/* QUERY_NFS */CREATE /*TEMPORARY*/ TABLE `QUERY_NFS` (
`SEQ_FK` mediumint(8) unsigned NOT NULL default '0',
`POS_IN_SEQ` mediumint(8) unsigned NOT NULL default '0',
`NF_FK` mediumint(8) unsigned NOT NULL default '0',
) TYPE=HEAP in z:\home\search\www\class.php on line 47

на MySQL 3.23.53

-~{}~ 13.01.05 10:39:

ну с этим разобрался
 

asm

Пофигист
Как писал Кром
>$query = "insert into ?TEMP_NUM? (NUM) values ('".join("'),('", range(0, $maxlen-1))."')";
Ругается на дублирующие ключи.

-~{}~ 13.01.05 11:02:

Угу патч помог
 

Wicked

Новичок
и у тебя тоже? :)
а если перед этим вывести результат такого запроса?[sql]select * from `TEMP_NUM`[/sql]
И какой версии у тебя mysql?
 
Сверху