sonic — простая поисковая система, альтернатива Elasticsearch.

поисковый движок
sonic — простая поисковая система, альтернатива Elasticsearch.

Введение

Недавно автор нашел на гитхабе очень интересный опенсорсный проект —sonic. Введение в звуковой проект очень простое.

🦔 Быстрый, легкий и не содержащий схемы механизм поиска. Альтернатива Elasticsearch, работающая на нескольких МБ ОЗУ.

В этом отрывке мы можем быстро понятьsonicхарактеристики.

Во-первых, он очень быстрый, намного быстрее, чем Elasticsearch, в официальном бенчмарке его поиск находится на уровне миллисекунд.

Во-вторых, он легкий. Elasticsearch становился все более и более тяжелым в течение длительного процесса разработки. Он не только поддерживает поиск, хранение, анализ и визуализацию, но Elasticsearch также охватывает большие данные, что делает кривую обучения Elasticsearch очень высокой. Использование также очень велико.Обычных машин совершенно недостаточно, а sonic очень легкий, быстрый в использовании и имеет мало API, поэтому он ориентирован на поиск.

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

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

Сказав все это, вы тоже хотите попробовать?sonic? Далее, давайте попрактикуемся вместе и посмотрим, сможем ли мы窥一斑而知全豹.

использовать

Установить

Во-первых, соник не поддерживает windows, так что лучше всего его использоватьdocker, поэтому, пожалуйста, убедитесь, что вы можете просто использовать докер, просто нужно знать некоторые концепции.

Введите в терминале следующую команду:

docker pull valeriansaliou/sonic:v1.2.0

Подождите некоторое время, docker все сделает за нас, после того, как пул будет завершен, нам нужен простой файл конфигурации sonic —config.cfg. Содержимое конфигурационного файла следующее:

# Sonic
# Fast, lightweight and schema-less search backend
# Configuration file
# Example: https://github.com/valeriansaliou/sonic/blob/master/config.cfg


[server]

log_level = "debug"


[channel]

inet = "0.0.0.0:1491"
tcp_timeout = 300

auth_password = "SecretPassword"

[channel.search]

query_limit_default = 10
query_limit_maximum = 100
query_alternates_try = 4

suggest_limit_default = 5
suggest_limit_maximum = 20


[store]

[store.kv]

path = "/var/lib/sonic/store/kv/"

retain_word_objects = 1000

[store.kv.pool]

inactive_after = 1800

[store.kv.database]

flush_after = 900

compress = true
parallelism = 2
max_files = 100
max_compactions = 1
max_flushes = 1
write_buffer = 16384
write_ahead_log = true

[store.fst]

path = "/var/lib/sonic/store/fst/"

[store.fst.pool]

inactive_after = 300

[store.fst.graph]

consolidate_after = 180

В этом конфигурационном файле вам может понадобиться обратить внимание только на два момента:

  • inet, прослушивающий порт sonic, по умолчанию здесь"0.0.0.0:1491".
  • auth_password, пароль sonic, по умолчанию здесь"SecretPassword".

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

Пожалуйста, сохраните файл конфигурации в подходящем месте, например, в месте хранения автора в/Users/pedro/Desktop/sonic-test/config.cfg.

Вводим в терминал следующую команду, запускаем звуковой сервис:

docker run -p 1491:1491 -v ~/Desktop/sonic-test/config.cfg:/etc/sonic.cfg  valeriansaliou/sonic:v1.2.0

Подождите некоторое время, если на терминале появится следующая информация, значит операция прошла успешно:

(INFO) - starting up
(INFO) - started
(DEBUG) - spawn managed thread: tasker
(DEBUG) - spawn managed thread: channel
(INFO) - tasker is now active
(INFO) - listening on tcp://0.0.0.0:1491

концепция

Перед конкретной операцией с данными нам очень необходимо понять рабочий механизм звука. Помните, что это важно, знание этого даст вам достаточно ясное представление об общей картине, чтобы сделать это возможным.窥一斑而知全豹.

Работу соника можно разделить на три режима:

  • Режим поиска (режим поиска), различие режимов звука очень жесткое.В режиме поиска вы можете выполнять только операции, связанные с поиском, но не можете выполнять операции, связанные с вставкой данных и резервным копированием. Ядро имеетQUERYиSUGGESTДве операции, соответственно используемые дляпоиск изавершить.
  • Режим приема, помнитеsonic只有在插入模式下才能进行数据的插入. Существует три операции ввода звуковых данных в керн:PUSH,POPиFLUSH. push добавляет элемент в область хранения, pop извлекает элемент из области хранения, а flush очищает все элементы в области хранения.
  • Режим управления (режим управления), sonic может выполнять ряд операций, таких как консолидация, резервное копирование и восстановление данных в режиме управления. Основные операцииTRIGGERиINFO, триггер в основном используется для консолидации, резервного копирования и восстановления данных, а информация используется для просмотра текущего состояния sonic.

Только что мы говорили о звуковом протоколе, мы назвали егоSonic Channel protocol. Этот протокол построен поверх протокола tcp.Если вы знакомы с Redis, вы можете обнаружить, что они очень похожи.

Sonic вывел эти три режима и связанные с ними операции на этом протоколе.Нетрудно обнаружить, что основная концепция и использование Sonic действительно просты.Конечно, автор не может тянуть это сюда.Документацияподробно изложено вSonic Channel protocolЕсли вас интересуют конкретные детали и практические методы, обязательно ознакомьтесь с ними.

действовать

После запуска звукового сервиса переходимtelnetЭто практичный инструмент для работы с ним.

Введите в терминале:

telnet localhost 1491

Появится следующее сообщение, указывающее на то, что ваше соединение установлено успешно.

Trying ::1...
Connected to localhost.
Escape character is '^]'.
CONNECTED <sonic-server v1.2.0>

Перед фактической вставкой нам также необходимо存储Сделайте краткий обзор. В начале статьи автор сказал, что соник фокусируется только на поиске, а хранение данных оставляет на реализацию другим базам данных. Так действительно ли Сонику нужно хранилище?

Ответ очевиден, да! Это обман? Конечно нет, соник не хранит данные, но ему нужно проиндексировать и сохранить часть искомых данных. Вы можете чувствовать себя немного запутанным, это нормально, давайте возьмем пример.

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

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

Хорошо, вот и точка! Как sonic хранит эти действительные данные поиска? Соник имеет две точки хранения, однаkvхранение, одинfstместо хранения.kvХранение хорошо изучено, т.е.key-valueДля хранения нам нужно объединить обзор и заголовок в одинvalue, и возьмем уникальныйkey,этоkeyКак правило, соответствующий первичному ключу базы данных, sonic будет хранить эти два значения вkvПлощадь.

За объединение отзыва и заголовка в одинvalue, я думаю многие немного не поймут, как их искать после слияния? Не бойтесь, соник автоматически сделает за нас сегментацию слов и пропустит их через倒排索引Когда вы ищете по словам, вы обычно выбираете только несколько слов для поиска, а не все, поэтому даже если они объединены, влияние не будет большим.Конечно, вы также можете выбрать только одно поле.value, чтобы не было проблем со слиянием.

Ну и в предыдущем пункте мы кинули倒排索引Эта концепция, автор не будет подробно объяснять ее здесь, если вы хотите понять, вы можете запросить некоторую информацию. Вы можете просто понять как倒排черезприйти, чтобы найти句子, индекс будет хранитьи句子Затем ассоциации между ними меняются местами, чтобы найти предложения путем поиска входящих слов. Здесь вы, возможно, поняли, что эти индексы не должны храниться вfstплощадь. Да, эти инвертированные индексы хранятся вfstрайон, с.kvУчастки хорошо разделены.

вставить данные

Что ж, после стольких разговоров мы наконец-то можем перейти к практической части. пройти черезtelnetПосле подключения соника пытаемся вставить кусок данных.

telnet localhost 1491
Trying ::1...
Connected to localhost.
Escape character is '^]'.
CONNECTED <sonic-server v1.2.0>

# 此处以 START 开始 ingest模式 SecretPassword 是密码,务必输入密码
START ingest SecretPassword
# sonic的返回信息
STARTED ingest protocol(1) buffer(20000)
# 通过PUSH 插入数据
# movie 为 collection名
# douban 为 bucket 名
# 1 为 object 名 即 key 值
# "the knight" 为 value 值
PUSH movie douban 1 "the knight"
# 插入成功后的返回值 ok
OK
# 退出
QUIT
ENDED quit

Автор подробно объяснил функцию каждой строки команд в комментариях, но это может быть недостаточно дружелюбно. Каждое подключение соника можно понимать как сессию (session), которая начинается сSTARTКоманда запускает.Конечно, если запуск не выполняется в течение определенного периода времени после подключения через телнет, соник автоматически закроет соединение.

STARTПосле команды начинается сеанс. Конкретный формат командыSTART <mode> <password>,какSTART ingest SecretPasswordвключит режим вставки (захват модели), парольSecretPassword. После успешной звуковой аутентификации возвращается информация об успешном установлении сеанса.STARTED ingest protocol(1) buffer(20000).

Затем, черезPUSHкоманда для вставки фрагмента данных, формат командыPUSH <collection> <bucket> <object> "<text>". Обратите внимание: sonic, как и большинство баз данных, имеет层级понятие, как вmongodbСуществует иерархическая концепция базы данных -> коллекция -> элемент -> поле, и у sonic также есть иерархия коллекция -> ведро -> [объект: текст].

Конечно, кто-то спросит, а какой от этого толк? просто это предложениеPUSH movie douban 1 "the knight", он может видеть роль иерархии, он может классифицировать поисковые данные и, что более важно, рыцарь принадлежит кmovieпод коллекциюdoubanведро, и когда есть другие коллекции, такие какsong, мы можем эффективно искать по определенному сегменту определенного набора.

После успешной вставки вернутьOK.

данные поиска

После вставки данных пытаемся снова подключиться и войти в сессию в режиме поиска.

# 开始一个搜索会话
START search SecretPassword
STARTED search protocol(1) buffer(20000)
# 搜索 movie -> douban 下的数据,搜索关键字为 the
QUERY movie douban "the"
PENDING Q5Z3lY25
# 得到搜索结果,返回object,即key值 1
EVENT QUERY Q5Z3lY25 1

Поиск, самая важная часть звука, чрезвычайно прост в использовании, но чрезвычайно эффективен. Его формат командыQUERY <collection> <bucket> "<terms>" [LIMIT(<count>)]? [OFFSET(<count>)]?,Знаком сsqlВы можете сразу понять, как его использовать.Коллекция и ведро представляют собой подробные иерархические отношения, термины представляют собой ключевые слова для поиска, лимит ограничивает количество возвращаемых результатов, а смещение представляет собой смещение результатов.

PENDING Q5Z3lY25
EVENT QUERY Q5Z3lY25 1

Эти две строки представляют собой возвращаемую информацию sonic после поиска, указывающую, что произошло событие, идентификатор события — Q5Z3lY25, а результат —1.

sonic также поддерживает автодополнение слов, например, вводth, он вернетсяtheЭто слово помогает вашему поиску быть автоматически завершенным и улучшает взаимодействие с пользователем. Конкретный формат:SUGGEST <collection> <bucket> "<word>" [LIMIT(<count>)]?.

START search SecretPassword
STARTED search protocol(1) buffer(20000)
# 输入 th 这两次字母
SUGGEST movie douban "th"
PENDING SukqsbYk
# 返回 the 这个已经补全的单词
EVENT SUGGEST SukqsbYk the

Обратите внимание здесь,SUGGESTПоддерживайте только элемент лимита, пожалуйста, пишите команду в верхнем регистреLIMIT.

разное

В режиме управления соник может выполнятьconsolidateармирование,backupрезервный,restoreвосстановление иINFOПросмотр данных звукового сервиса и других операций.

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

Эпилог

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

До сих пор мы представили почти все звуковые, По сравнению с Elasticsearch, он действительно достаточно мал и достаточно прост, чтобы сделать поиск чрезвычайно изысканным.

В следующей статье я буду использоватьpython,mongodbСделайте простое приложение для поиска и ждите его, господа.

Простота, вызванная чрезмерной инкапсуляцией, не принесет истинной простоты, а только усложнит. —— Сравнительное мышление от sonic и Elasticsearch