Сравнение алгоритмов индексирования для поиска

Gride

Новичок
Сравнение алгоритмов индексирования для поиска

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

Могут ли знающие люди сравнить каждый из способов. Плюсы и минусы пожалуста, объем индекса, быстродействие и тд.
 

Фанат

oncle terrible
Команда форума
тебе не кажется, что логичнее было бы задать этот вопрос в форуме по mysql?
здесь есть такой.

второй способ тобой изложен весьма забавно.
 

clevel

Новичок
я для себя выбрал воторой вариант по следующим причинам:
1.разбиваю весь текст на отдельные слова, в таблице индексов храню id первоформы каждого слова+его позицию от начала страницы. Это дает возможность искать по int полю с учетом морфологии русского языка
2. эта схема работает на моей цмс, где есть сайты, для которых нужен поиск, и для которых - нет. В последнем случае индекс просто не формируется...
3.Можно вводить свои алгоритмы определения релевантности поиска. У меня сейчас есть возможность также искать с учетом точного отступа каждого слова от начала страницы/предыдущего слова...
4.такие фразы как "щит 3.0х6.0" по точному совпадению ты не найдешь в мускуле, а у меня - да... Специфика отдельных сайтов - важная вещь
Короче, проф. поиск своими руками...
 

Фанат

oncle terrible
Команда форума
clevel
а запрос "щит 3.0 х 6.0" найдет запись с "щит 3.0х6.0" ?
 

HEm

Сетевой бобер
Автор оригинала: Фанат
clevel
а запрос "щит 3.0 х 6.0" найдет запись с "щит 3.0х6.0" ?
а лучше даже "щит 3х6"

и вдогонку маленький опрос - когда пишете что-то навроде "NNxYY" вы (все читающие топик) используете русскую или английскую х?
 

Falc

Новичок
Gride
Это совершено разные вещи, 1-ый вариант это встроеный индекс и делать ничего не надо все уже сделали за тебя, правда если надо будет что-то "наворотить" то тоже не получится, это встроеное средство.

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

clevel

Новичок
Фанат
будет искать без учета пробелов, без разницы в русской и английской буквы "х", без разницы "3.0" и "3,0" и "3"...

-~{}~ 05.02.04 14:46:

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

Demiurg

Guest
Хорошо, а как ты их находишь ?
в смысле, как из щита получаешь, простите, щит
 

Gride

Новичок
Автор оригинала: Falc
Gride
Это совершено разные вещи, 1-ый вариант это встроеный индекс и делать ничего не надо все уже сделали за тебя, правда если надо будет что-то "наворотить" то тоже не получится, это встроеное средство.
Я тут встречал статью Дмитрия Лебедева: Безопасный и удобный поиск в mySQL. Урл не помню. Если я правильно понял, то там фулиндекс в основном для расчета релевантности выборка же через Лайк. Через Лайк можно какой хош язык запросов написать. Фул индекс якобы это тоже поддерживает, но насколько оно удобно не знаю. Думаю, это можно в пользу первого метода.

А как каждый из способов насчет производительности, объемов индекса и скорости поиска? У тогоже яндекса индекс 60% от текста.
 

Falc

Новичок
HEm
>>Откуда такие данные?
на сайте яндекса тыкие данные были, я правда точной цифры не помню.


Gride
>>А как каждый из способов насчет производительности, объемов индекса и скорости поиска? У тогоже яндекса индекс 60% от текста.

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

Silent

Новичок
Насколько я могу судить по своим экспериментам (правда очень недолгим), второй способ плохо справляется с >10000 документов. То есть для одного небольшого (среднего) сайта будет работать, дальше нужно использовать специальные индексы, заточенные под эту задачу.
 

Blindman

Новичок
Silent
Второй способ используется в этом форуме. Ты считаешь, что vBulletin плохо справляется с поиском?
 

Silent

Новичок
Это смотря с чем сравнивать. Если с другими форумами, то очень хорошо. Но попробуй задать запрос "PHP MySQL", он находит всего 2348 тем, но обрабатывается очень долго. Тут уже каждый должен сам решить, устраивает ли его такая скорость. Я считаю, что это немного дольше, чем мне хотелось бы.

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

word1 -> doc1
word2 -> doc1
word3 -> doc1
word4 -> doc2
word1 -> doc2
word3 -> doc3
word2 -> doc3

при этом во время поиска придется много прыгать по диску, собирая нужную информацию. Время доступа к данным у соверменных дисков около 10ms, то есть за одну секунду диск может прочесть ТОЛЬКО 100 строк из базы, если бы не было кеширования. И только благодаря многоуровневому кешированию данных (как самим диском, так и операционной системой, а иногда еще и самим приложением) позволяет многократно ускорить выборку. Очевидно, что с ростом числа строк в таблице никакие многомегабайтные кеши диска уже не смогут спасти и скорость выборки резко снизится из-за необходимости многократно перемещать головку диска.

Можно значительно ускорить данный алгоритм, если упорядочить базу таким образом:

word1 -> doc1
word1 -> doc2
word2 -> doc1
word2 -> doc3
word3 -> doc1
word3 -> doc3
word4 -> doc2

или еще лучше так:

word1 -> doc1,doc2
word2 -> doc1,doc3
word3 -> doc1,doc3
word4 -> doc2

Тогда диск сразу сможет прочесть всю нужную информацию и ее останется только обработать. Такая структура позволит работать с числом документов порядка миллиона. При дальнейшем росте мы упремся в другое ограничение - скорость передачи данных от диска в оперативную память. Если искомое слово содержится в 10000000 документов, то только список документов займет 40Мб (по 4 байта на указатель), а это уже примерная скорость передачи данных в современных системах. Чтобы обойти это ограничение, список документов сжимают (использую коды Голомба или нечто подобное), что позволяет получить менее одного байта на указатель. Если же выйти на уровень больших поисковых систем, то даже сжатие не даст особого выигрыша и там нужны еще более хитые алгоритмы. Например, можно список документов отсортировать по релевантности и при поиске не читать сразу весь список, а сначала только небольшую его часть. Если этого окажется достаточно, чтобы сформировать первую страницу с результатами, то дальше можно и не читать.
 

Blindman

Новичок
Разговор идет о MySQL, а не специализированной базе данных для поисковой системы. Falc уже дал ответ на вопрос .
 

Silent

Новичок
Разговор шел о плюсах и минусах. Я сказал о минусе второго способа и объяснил, почему. В том же MySQL есть встроенный специализированный полнотекстовый индекс.
 

Blindman

Новичок
Silent Не спорю, второй способ будет проигрывать в скорости, это очевидно, причем тем больше, чем больше объем данных.

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

Falc

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