# 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>大家好，我是Mike。</p>
    <p>我最近开始在Manticore担任开发倡导者。我并非完全远离IT领域，但正在追赶现代技术。在这篇博客中，我将分享我的经验和关于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)

#### 基础设施部署

我们将使用Docker容器进行Manticore的实验，因为这是一个流行的跨平台解决方案，并且通常用于Manticore需求最高的环境中，尽管数据库有适用于所有流行操作系统的版本。

*那些已经知道如何使用docker的专业人士可以在容器启动前跳过这些步骤。好吧，新手和我将从头开始逐步进行。*

首先，您必须完成以下步骤：
1. 从网站[https://www.docker.com/](https://www.docker.com/products/docker-desktop/)下载适用于我们平台的Docker Desktop：
![Docker Desktop下载页面](./mike-first-table/QSG_1.png)
2. 安装完成后，我们需要获取官方的Manticore镜像。在应用程序的顶部栏中有一个搜索栏。只需在该栏中输入"ManticoreSearch"。
3. 在输出结果中，我们有"manticoresearch/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"
![Manticore docker镜像的设置和运行](./mike-first-table/QSG_3.png)

接下来，返回到容器标签。我们将在活动容器列表中找到我们的容器。在下拉菜单中，有一个"在终端中打开"选项。将弹出一个与您的容器直接连接的终端窗口。
![Docker Desktop中终端连接按钮的视图](./mike-first-table/QSG_4.png)
恭喜，您已成功在计算机上安装了Manticore Search docker镜像。
![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" 文件管理器并启动了它。
现在，您的终端应该看起来像这样：
![带有 mc 文件管理器的终端](./mike-first-table/QSG_6.png)

### 第一步。第一个表。

好的，让我们连接到数据库并创建第一个表。

```bash
mysql -h0 -P9306
```
*这里 `-h` 标志用于主机连接，设置为 `0` 因为我们正在尝试连接到本地主机。使用 `-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)
```
删除记录的方式与查询语句相同：
```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/)以及如何更新我们的记录。

![结束图片](./mike-first-table/QSG_end.JPG)
