Pull to refresh

Comments 23

Имхо хороший доступный туториал о том, как строить FTS-системы вообще. Не обязательно применительно к Go. Не хватает вкусных вещей типа синонимов, поиска слов с ошибками (через расстояние левенштейна), устойчивых сочетаний (с задаваемой дистанцией между токенами поиска).

Всё это есть в sphinxsearch (qsuggets, оператор кворума, биграммы на основе слов), но искать алгоритмы в исходниках дело не самое эффективное.
Из «претензий» к статье: вместо стемминга лучше использовать лемматизацию, да и стоп-слова лучше не выкидывать напрочь, а ранжировать с меньшим весом. Впрочем, ранжирование это очень глубокая нора.

А есть ли, кстати, возможность использовать sphinxsearch из Go приложений? Ни одной библиотеки на Go нормальной для взаимодействия с ним нет (может плохо искал, конечно). Гуглится yunge/sphinx, но он устарел, и не потокобезопасный. Драйвер от MySQL использовать для соединения со Sphinx тоже не удаётся.
В Сфинксе нет ничего необычного. Там же алгоритмы просты.
Вот настраивать эти алгоритмы под свои задачи — сложно.
youtu.be/wCGBTjHikwA
Сам автор Сфинкса рассказывает что да как.

Сам же инструмент — ничего особенного из себя не представляет.
Для Go есть такая штука, аналогичная Сфинксу, но на Go писанная и вкомпилируется прямо в программу:
github.com/blevesearch/bleve

Вопрос изначально возник именно про интеграцию Go-приложения со Sphinx. В конторе одной legacy проект переписывался, которому уже много лет. Думали на Go его переписать, но столкнулись с проблемой из-за того, что Go со Sphinx нормально не подружить (а отказываться от существующего решения в виде Sphinx в пользу другого по условиям задачи нельзя было). То есть bleve прикрутить не получилось бы. Сейчас уже это всё не сильно актуально, но, пользуясь случаем, решил спросить.
А порт к Lucene нет желания попробовать? Вроде как есть проект golucene
Сам по себе Lucene отличный «движок», а в сочетании с идеей токенов, так иногда просто конфетка получается.
Спасибо за статью, очень познавательно и интересно
Хороший ответ, аргументированный
Интересно бы почитать продолжение, как писали выше добавить например формулу расстояния Левенштейна.

Левенштейн в лоб делать нельзя — свалимся иначе в full scan. Можно, например, по заданным паттерну и максимальному расстоянию найти все токены, и затем искать пересечение множества найденных токенов и токенов документов

К концу этой статьи он сможет выполнять поиск по миллионам документов менее чем за миллисекунду.

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


Так что «можно использовать grep, но это не всегда лучшая идея» — пока что чистой воды спекуляция.

Не могу понять почему люди массово не знаю что map это не карта, а отображение в русском языке?)
Вытекает из соответствующего математического понятия.
Вроде бы тема не тривиальная и подразумевает базовые знания математики и компьютерных наук.
p.s.
У меня даже такой критерий сформировался, если человек называет map, картой, он или не учился в профильном вузе или плохо учился. Но в любом случае имеет фундаментальные пробелы.)

BleveSearch, написанная на Go и готовая к промышленному использованию развитая система FTS, которую можно как пакет использовать в программах на Go.
Отличная статья! Идея для домашней работы — добавить вычисление сходства документов
А кто-нибудь знает про про порядок итерации в отображениях в go? Не могу понять почему он отсортирован.

В силу внутреннего устроиства там порядок элементов не определен, что отражено в спеке.

Бенчмарки, нужны бенчмарки. Этот велосипед насколько быстрее постгрес fts или sphinx? Можно результаты аналогичных запросов? Просто не понятно, а стоит ли повторять подвиг автора.
Я почему спрашиваю, потому что аналогичный велосипед на go сделал, только у меня не fts, а фасеточный поиск )) И, производительностью я доволен. Однако пришлось делать ниразу не универсальный код — все подогнанно компилятором под мою задачу. Но, я получил на редких дурацких запросах прирост 100х относительно mysql. Ну, и в самых популярных, менее 1мс на запрос.

Понятно что это решение не дотягивает до вылизанного fts-поиска в той же постгре или сфинксе, т.е. придется много простых и дурацких вещей руками делать (типа подсветки найденного результата), так же учитывать расстояние между словами. Но, все же, решение имеет право на существование, по сути, во многом, го для этого и был создан — ускорить кастомным решением то, что универсальным тормозит.
Напишите статью, интересно посмотреть на ваше решение
Sign up to leave a comment.

Articles