# Mike: learning: First steps

This article is for beginners at Manticore Search. It will guide you through the first steps of using the search engine.

### Обо мне

<div style="display: flex; align-items: flex-start; padding: 0; margin: 0;">
  <img src="./mike-first-table/mike.jpg" alt="Mike" style="max-width: 50%; max-height: 400px; margin: 0; padding: 0;">
  <div style="margin-left: 20px;">
    <p>Привет, я Майк.</p>
    <p>Я недавно начал работать в Manticore в качестве Developer Advocate. Я человек, который не полностью оторван от ИТ, но я догоняю современные технологии. В этом блоге я буду делиться своим опытом и тем, что узнаю о Manticore. Я планирую документировать своё путешествие в формате дневника, объясняя, что такое Manticore и как его использовать. Давайте узнаем, как всё работает вместе, выявим проблемы и будем взаимодействовать с разработчиками в реальном времени.</p>
    <p>Это мой первый пост в блоге. Если вам интересно изучать Manticore вместе со мной, я буду держать вас в курсе в:
    <ul>
      <li>
      <a href="https://twitter.com/manticoresearch">Twitter</a>
      </li>
      <li>
      Telegram: <a href="https://t.me/manticoresearch_en">EN</a> / <a href="https://t.me/manticore_chat">RU</a>
      </li>
      <li>
      <a href="https://slack.manticoresearch.com/">Slack</a>
      </li>
    </ul>
  </div>
</div>

### Несколько слов о Manticore

Когда я начал изучать Manticore Search, я обнаружил, что это мощная открытая база данных. Она может выполнять быстрый полнотекстовый поиск с использованием как SQL, так и JSON, и многое другое. Она была создана в 2017 году и с тех пор прошла множество тестов и улучшений. Благодаря сильному сообществу было исправлено множество багов, и сейчас она работает очень хорошо.

Manticore отлично подходит для быстрого поиска слов, фраз и предложений, а также имеет множество других продвинутых функций. Это делает её идеальной для таких задач, как онлайн-магазины и корпоративные поисковые системы. Благодаря множеству полезных возможностей и поддержке сообщества и команды Manticore Software, легко понять, почему многие выбирают Manticore для своих поисковых нужд.

В этой статье я покажу, как начать работу с Manticore

### С чего начать
#### Минимальная среда

* Интернет
* Не слишком старая ОС (Mac, Win или Lin — не имеет значения)
* Docker или Docker Desktop.
* Относительно прямые руки
* Сильное желание сделать мир лучше, создавая качественное, простое в использовании программное обеспечение с быстрыми базами данных и поисковыми системами для полнотекстовой информации.

#### Инструменты

* Консоль (или вы можете использовать Docker Desktop для подключения к контейнеру)
* Файловый менеджер (по желанию, мне нравится [Midnight Commander](https://midnight-commander.org))
* Текстовый редактор для консоли (например, mcedit, nano, vim). В примерах мы будем использовать редактор, встроенный в Midnight Commander, mcedit, чтобы не искать команды выхода для vim.

*При использовании MC вам не нужно устанавливать редактор, так как встроенного достаточно. Если установлен дополнительный редактор, при первом выполнении команды [F4 Edit] MC предложит выбрать нужный. В примере будет использоваться встроенный редактор MC, который вызывается нажатием [F4] при выборе файла в интерфейсе или командой mcedit <имя файла для создания/открытия>.*

> Более быстрый способ — делать всё из командной строки. [Я хочу быстро!](#cli_manticore_docker)

#### Развёртывание инфраструктуры

Мы будем проводить эксперименты с Manticore в Docker‑контейнере, так как это популярное кроссплатформенное решение, часто используемое в среде, где Manticore наиболее востребован, хотя существуют версии базы данных для всех популярных операционных систем.

*Те профессионалы, которые уже умеют работать с Docker, могут пропустить это до запуска контейнера. А новички, включая меня, пройдём шаги с нуля.*

Для начала вам нужно выполнить следующие шаги:
1. Скачайте Docker Desktop для нашей платформы с сайта [https://www.docker.com/](https://www.docker.com/products/docker-desktop/):
![Docker Desktop download page](./mike-first-table/QSG_1.png)
2. После установки нам нужно получить официальный образ Manticore. В верхней панели приложения есть строка поиска. Просто введите туда «ManticoreSearch».
3. В результатах мы видим «manticoresearch/manticore».
![Image about vision of manticore ManticoreSearch](./mike-first-table/QSG_2.png)
4. Нажмите кнопку «pull», затем переключитесь на вкладку образов.
5. Затем выберите только что загруженный образ и нажмите «play».

В появившемся окне вам нужно указать некоторые дополнительные настройки:
- Имя контейнера: `manticore`.
- Для портов используем тот же порт, что и у базы данных, для простоты — `9306`.
- В переменных окружения задайте переменную `EXTRA` со значением `1`. Это необходимо для запуска дополнительных компонентов, которые очень полезны. Подробнее об этом [здесь](https://github.com/manticoresoftware/docker/tree/docker-6.2.12?tab=readme-ov-file#manticore-columnar-library-and-manticore-buddy).

Затем нажмите «Run»
![Settings and run for Manticore docker image](./mike-first-table/QSG_3.png)

Далее вернитесь на вкладку контейнеров. Мы найдём наш контейнер в списке активных контейнеров. В выпадающем меню есть опция «Open in terminal». Откроется окно с терминалом, напрямую подключённым к вашему контейнеру.
![View of terminal connection button in Docker Desktop](./mike-first-table/QSG_4.png)
Поздравляем, вы успешно установили Docker‑образ Manticore Search на свой компьютер.
![Terminal in Docker Desktop](./mike-first-table/QSG_5.png)

<a id="cli_manticore_docker"></a>
{{< notice "info" >}}
После того как поиграл с интерфейсом Docker Desktop некоторое время, вы понимаете, что самый быстрый способ выполнить задачу — через командную строку.
<code>docker run \-\-name manticore -p 9306:9306 -d manticoresearch/manticore</code>
<code>docker exec -it manticore /bin/sh</code>
{{< /notice >}}


6. Чтобы упростить задачу, мы установим файловый менеджер Midnight Commander внутри контейнера:

```bash
apt update
apt install mc
mc
```
Итак, мы обновили менеджер пакетов «apt», затем установили файловый менеджер «mc» и запустили его.
Теперь ваш терминал должен выглядеть так:
![Terminal with mc file manager](./mike-first-table/QSG_6.png)

### Первый шаг. Первая таблица.

Хорошо, давайте подключимся к базе данных и создадим нашу первую таблицу.

```bash
mysql -h0 -P9306
```
*Вот флаг `-h` для подключения к хосту, установленный в `0`, потому что мы пытаемся подключиться к localhost. Используйте флаг `-P` (обратите внимание на заглавную P) для подключения к порту; мы используем внутренний номер порта.*

Давайте создадим таблицу с полем «info» типа текст и полем «value» типа целое число. Кроме того, добавим к этой таблице стеммер для английских слов.

```sql
CREATE TABLE demo (info TEXT, value INT) morphology = 'stem_en';
Query OK, 0 rows affected (0.00 sec)
```
Чтобы увидеть, какие поля были созданы при создании или изменении столбца таблицы, используйте команду `desc` (это как «описание»).
```sql
DESC demo
+-------+-----------+------------------+
| Field | Type      | Properties       |
+-------+-----------+------------------+
| id    | bigint    |                  |
| info  | text      | indexed stored   |
| value | uint      |                  |
+-------+-----------+------------------+

3 rows in set (0.00 sec)
```
Также вы можете проверить, какой алгоритм стемминга или лемматизации связан с таблицей:
```sql
SHOW TABLE demo SETTINGS;
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| settings      | morphology = stem_en  |
+---------------+-----------------------+

1 row in set (0.01 sec)
```
Добавим данные в таблицу. Ниже показан вариант добавления одной записи за раз:
```sql
INSERT INTO demo (info, value) VALUES ('Walking down the street', 1);

Query OK, 1 row affected (0.01 sec)
```
а вот как добавить записи пакетно:
```sql
INSERT INTO demo (info, value) VALUES ('Walking along the embankment', 2), ('Walking the dog', 3), ('Reading a book', 4), ('Book read ', 5);

Query OK, 3 rows affected (0.00 sec)
```
Теперь проверим, что мы записали в таблице:
```sql
SELECT * FROM demo;

+-----------------------+----------------------------------------------------+-------+
| id                    | info                                               | value |
+-----------------------+----------------------------------------------------+-------+
| 8217204862853578790   | Walking down the street                            |     1 |
| 8217204862853578791   | Walking along the embankment                       |     2 |
| 8217204862853578792   | Walking the dog                                    |     3 |
| 8217204862853578793   | Reading a book                                     |     4 |
| 8217204862853578794   | Book read                                          |     5 |
+-----------------------+----------------------------------------------------+-------+

5 rows in set (0.01 sec)
```
Давайте поискать слово, близкое по смыслу к добавленным:
```sql
SELECT * FROM demo WHERE match('read');

+---------------------+-----------------------------------+-------+
| id                  | info                              | value |
+---------------------+-----------------------------------+-------+
| 8217204862853578794 | Book read                         |     5 |
| 8217204862853578793 | Reading a book                    |     4 |
+---------------------+-----------------------------------+-------+

2 rows in set (0.01 sec)
```
Вы также можете увидеть ключевое слово, по которому найдены записи, их количество, документы и многое другое:
```sql
SHOW META;

+----------------+----------+
| Variable_name  | Value    |
+----------------+----------+
| total          | 2        |
| total_found    | 2        |
| total_relation | eq       |
| time           | 0.000    |
| keyword[0]     | read     |
| docs[0]        | 2        |
| hits[0]        | 2        |
+----------------+----------+

7 rows in set (0.01 sec)
```
Чтобы работать с полями, не участвующими в полнотекстовом поиске, атрибутами, вы можете использовать классические SQL‑операторы фильтрации:
```sql
SELECT * FROM demo WHERE value > 3;

+---------------------+-----------------------------------+-------+
| id                  | info                              | value |
+---------------------+-----------------------------------+-------+
| 8217204862853578794 | Book read                         |     5 |
| 8217204862853578793 | Reading a book                    |     4 |
+---------------------+-----------------------------------+-------+

2 rows in set (0.01 sec)
```
Удаление записей можно выполнять так же, как запросы SELECT:
```sql
DELETE FROM demo WHERE value = 5;

Query OK, 1 row affected (0.01 sec)

DELETE FROM demo WHERE match ('street');

Query OK, 1 row affected (0.01 sec)

DELETE FROM demo WHERE id = 8217204862853578791;

Query OK, 1 row affected (0.00 sec)

SELECT * FROM demo;

+---------------------+---------------------------------+-------+
| id                  | info                            | value |
+---------------------+---------------------------------+-------+
| 8217204862853578792 | Walking the dog                 |     3 |
| 8217204862853578793 | Reading a book                  |     4 |
+---------------------+---------------------------------+-------+

2 rows in set (0.00 sec)
```
Почему бы вам не попробовать добавить и поискать несколько записей? Когда закончите, мы перейдём к следующему.
Не забудьте отключиться:
```sql
exit;
```

На сегодня всё, в следующий раз мы посмотрим, как [изменить файл форм слов в существующей таблице](/blog/mike-replace-update-wordforms/) и как обновлять наши записи.

![end photo](./mike-first-table/QSG_end.JPG)
