Папа, подари мне Яндекс. Как написать свой поисковик

123
DU
На сайте с 20.10.2006
Offline
105
#11
antono:
Про полнотекстный (fulltext) поиск ни слова. А LIKE очень тормозная конструкция.

В данном запросе полноностью согласен, но с индексами не намного тормознутее любой другой функции сравнения. Если пользоваться таблицей синонимов, то и ЛИКЕ не нужен. Качество поиска и скорость fulltext также оставляет желать лучшего, в отличие от правильно составленных запросов без него.

antono
На сайте с 12.07.2004
Offline
301
#12
Yukko:
antono, читайте внимательно статью, там и про полнотекстовый поиск и про тормознутость LIKE написано.

Извиняюсь, не заметил маленький абзац про него.

DIMON-UA:
В данном запросе полноностью согласен, но с индексами не намного тормознутее любой другой функции сравнения. Если пользоваться таблицей синонимов, то и ЛИКЕ не нужен. Качество поиска и скорость fulltext также оставляет желать лучшего, в отличие от правильно составленных запросов без него.

Качество поиска фултекст зависит от составленного запроса к базе. Можно добиться хорошего качества, ничем не уступающего LIKE, а вот скорость в десятки раз быстрее. По крайней мере мне не удалось сделать быстрый поиск по базе из 150000 записей с текстами около килобайта с помощью LIKE, а фултекстом удалось. Может просто я не до конца понял как обращаться с LIKE.

DU
На сайте с 20.10.2006
Offline
105
#13
antono:
Извиняюсь, не заметил маленький абзац про него.






Качество поиска фултекст зависит от составленного запроса к базе. Можно добиться хорошего качества, ничем не уступающего LIKE, а вот скорость в десятки раз быстрее. По крайней мере мне не удалось сделать быстрый поиск по базе из 150000 записей с текстами около килобайта с помощью LIKE, а фултекстом удалось. Может просто я не до конца понял как обращаться с LIKE.

Чтобы лайк летал он должен быть индексом. Попробуй создать отдельную таблицу для поиска, загнать в нее все ключевики текста, положение слов на странице и поиск будет на порядок быстрее и гибче фултекста. Но в таком варианте и Лайк не обязателен можна использовать "=", если использовать только корни или доп таблицу словоформ. Для сранения тестил на базе из примерно 200 тыс записей. Результаты: Лайк - 1,2 - 2,0 сек (качество поиска на 4), Фултекст 0,6 - 0,9 сек (качество поиска 3), Предложенный способ: 0,05 - 0,1 сек, качество поиска зависит только от фантазии исполнителя

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

Y
На сайте с 02.01.2006
Offline
138
#14
DIMON-UA:
Чтобы лайк летал он должен быть индексом.

согласен. + насколько я помню, по объемным полям можно делать индекс не на все поле, а на первые несколько символов.

БС
На сайте с 06.01.2006
Offline
32
#15

Yukko

Сергей, LIKE, начинающийся с %, не использует индексы.

Y
На сайте с 02.01.2006
Offline
138
#16

Бресь Сергей, знаю :)

DU
На сайте с 20.10.2006
Offline
105
#17
Бресь Сергей:
Yukko
Сергей, LIKE, начинающийся с %, не использует индексы.

Дочитайте до конца, он даже по текстовым полям не ищет а только по целочисленным.

Y
На сайте с 02.01.2006
Offline
138
#18

DIMON-UA, ему читать не надо ничего ;) поверьте на слово 🚬

NB
На сайте с 14.09.2004
Offline
95
#19

Yukko, вместо предложенных Вами эвристик, касающихся морфологии, я бы предложил (на выбор) три возможных алгоритма:

1) Построение на основе ispell полного русского словаря (всех словоформ), и поиск по нему всех нормальных словоформ. Объем словаря будет очень большим, т.к. нужно будет хранить все словоформы, полученные из ispell.

2) Поиск основной формы слова (также по ispell) на основе алгоритма, описанного здесь:

http://xpoint.ru/know-how/VebAlgoritmyi/RabotaSTekstami/RabotaSRusskoyMorfologieyPriPomoschiSlovaryaIspell

В базе потребуется хранить только исходный ispell-овский словарь.

3) Вовсе без словаря -- использовать стеммер Портера (это, насколько мне известно, единственный более-менее приемлемый стеммер для русского языка). Я, кстати предпочитаю именно этот вариант. Оригинальное описание здесь: http://snowball.tartarus.org/algorithms/russian/stemmer.html

У Котерова есть неплохая реализация: http://forum.dklab.ru/php/advises/HeuristicWithoutTheDictionaryExtractionOfARootFromRussianWord.html

Могу поделиться и своей, но у Дмитрия сделано проще и изящнее.

Y
На сайте с 02.01.2006
Offline
138
#20

Nick Bubelo, полезные дополнения :)

PS. +1 pf ispell ;)

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий