Установка Meilisearch · 19 min read · Oct 26, 2025

Как установить и настроить Meilisearch на Debian 12

Meilisearch — это поисковая система с открытым исходным кодом, написанная на языке Rust. Написание на Rust требует меньше ресурсов для работы и может выполняться с помощью одной команды в командной строке. Процесс установки проще, чем у альтернативных поисковых систем, и требует меньше шагов. Его функции включают нечеткое соответствие и индексацию без схемы. Он поставляется с веб-интерфейсом для демонстрационных целей. Его можно интегрировать в различные веб-приложения через различные библиотеки, доступные на нескольких языках, таких как JavaScript, Python, PHP, Ruby и т. д.

В этом руководстве вы узнаете, как установить Meilisearch в производственной среде на сервере Debian 12 и использовать его для выполнения нескольких простых поисков.

Предварительные требования

  • Сервер с установленным Debian 12 и минимум 2 ГБ ОЗУ.

  • Пользователь, не являющийся root, с правами sudo.

  • Упрощенный брандмауэр (UFW) включен и работает.

  • Полное доменное имя (FQDN), например meilisearch.example.com, указывающее на ваш сервер. Это полезно, если вы хотите обслуживать Meilisearch через SSL с использованием прокси-сервера.

  • Все обновлено. $ sudo apt update && sudo apt upgrade

  • Для руководства требуется несколько основных пакетов. Некоторые из них могут уже быть установлены на вашем сервере. $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

Шаг 1 - Настройка брандмауэра

Первый шаг перед установкой любых пакетов — настроить брандмауэр для разрешения HTTP и HTTPS соединений.

Проверьте статус брандмауэра.

$ sudo ufw status

Вы должны увидеть что-то вроде следующего.

Статус: активен

Кому                         Действие      Откуда
--                         ------      ----
OpenSSH                    ALLOW       Везде
OpenSSH (v6)               ALLOW       Везде (v6)

Разрешите порты HTTP и HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Проверьте статус снова, чтобы подтвердить.

$ sudo ufw status
Статус: активен

Кому                         Действие      Откуда
--                         ------      ----
OpenSSH                    ALLOW       Везде
80/tcp                     ALLOW       Везде
443/tcp                    ALLOW       Везде
OpenSSH (v6)               ALLOW       Везде (v6)
80/tcp (v6)                ALLOW       Везде (v6)
443/tcp (v6)               ALLOW       Везде (v6)

Шаг 2 - Установка Meilisearch

Существует несколько способов установки Meilisearch. Мы используем самый простой метод, который включает копирование двоичного файла на наш сервер.

Установите Meilisearch.

$ curl -L https://install.meilisearch.com | sh

Сделайте двоичный файл исполняемым.

$ chmod +x meilisearch

Сейчас двоичный файл можно использовать только из каталога, где вы его скачали. Чтобы иметь возможность использовать его откуда угодно, переместите двоичный файл в каталог /usr/local/bin.

$ sudo mv ./meilisearch /usr/local/bin/

Подтвердите, что Meilisearch установлен и работает правильно.

$ meilisearch --version
meilisearch 1.7.6

Шаг 3 - Создание системного пользователя для Meilisearch

Запуск Meilisearch от имени root может создать проблемы с безопасностью. Чтобы избежать этого, создайте системного пользователя для запуска Meilisearch.

$ sudo useradd -d /var/lib/meilisearch -b /bin/false -m -r meilisearch

Шаг 4 - Настройка Meilisearch

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

$ openssl rand -hex 30

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

65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611

Скачайте последний файл конфигурации из репозитория Meilisearch на GitHub и скопируйте его в каталог /etc.

$ sudo sh -c 'curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml'

Откройте его для редактирования.

$ sudo nano /etc/meilisearch.toml

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

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

env = "production"
master_key = "173e95f077590ed33dad89247247be8d8ce8b6722ccc87829aaefe3207be"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"

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

no_analytics = true

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

max_indexing_memory = "1 GiB"

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

max_indexing_threads = 1

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

Еще одна настройка, которую вы должны знать, это максимальный объем полезной нагрузки, который Meilisearch может принять. Значение по умолчанию установлено на 100 МБ. Вы можете изменить его, настроив следующую переменную.

http_payload_size_limit = "100 MB"

После завершения сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Шаг 5 - Создание каталогов и установка прав

Создайте каталоги, в которых Meilisearch будет хранить свою базу данных, дампы базы данных и снимки.

$ sudo mkdir /var/lib/meilisearch/dumps -p
$ sudo mkdir /var/lib/meilisearch/snapshots

Установите владельца и группу для этих каталогов на системного пользователя, которого мы создали для Meilisearch.

$ sudo chown -R meilisearch:meilisearch /var/lib/meilisearch

Установите владельца и группу для двоичного файла Meilisearch.

$ sudo chown meilisearch:meilisearch /usr/local/bin/meilisearch

Установите правильные разрешения на каталог.

$ sudo chmod 750 /var/lib/meilisearch

Шаг 6 - Запуск Meilisearch как службы

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

Создайте и откройте /etc/systemd/system/meilisearch.service для редактирования.

$ sudo nano /etc/systemd/system/meilisearch.service

Вставьте следующий код в него.

[Unit]
Description=Meilisearch
After=systemd-user-sessions.service

[Service]
Type=simple
WorkingDirectory=/var/lib/meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch

[Install]
WantedBy=multi-user.target

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Включите службу.

$ sudo systemctl enable meilisearch

Запустите службу Meilisearch.

$ sudo systemctl start meilisearch 

Проверьте статус службы

$ sudo systemctl status meilisearch

Вы должны получить аналогичный вывод.

? meilisearch.service - Meilisearch
     Loaded: loaded (/etc/systemd/system/meilisearch.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-05-03 03:02:53 UTC; 5s ago
   Main PID: 1008 (meilisearch)
      Tasks: 6 (limit: 2251)
     Memory: 23.0M
        CPU: 10ms
     CGroup: /system.slice/meilisearch.service
             ??1008 /usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml

May 03 03:02:53 meilisearch meilisearch[1008]: Commit date:                "unknown"
May 03 03:02:53 meilisearch meilisearch[1008]: Package version:        "1.7.6"
May 03 03:02:53 meilisearch meilisearch[1008]: Anonymous telemetry:        "Disabled"
May 03 03:02:53 meilisearch meilisearch[1008]: A master key has been set. Requests to Meilisearch won't be authorized unless you provide an authentication key.
May 03 03:02:53 meilisearch meilisearch[1008]: Check out Meilisearch Cloud!        https://www.meilisearch.com/cloud?utm_campaign=oss&utm_source=engine&utm_medium=cli
May 03 03:02:53 meilisearch meilisearch[1008]: Documentation:                        https://www.meilisearch.com/docs
May 03 03:02:53 meilisearch meilisearch[1008]: Source code:                        https://github.com/meilisearch/meilisearch
May 03 03:02:53 meilisearch meilisearch[1008]: Discord:                        https://discord.meilisearch.com
May 03 03:02:53 meilisearch meilisearch[1008]: 2024-05-03T03:02:53.891366Z  INFO actix_server::builder: starting 2 workers
May 03 03:02:53 meilisearch meilisearch[1008]: 2024-05-03T03:02:53.891396Z  INFO actix_server::server: Actix runtime found; starting in Actix runtime

Meilisearch установлен и работает. Давайте откроем службу для внешнего доступа, используя сервер Nginx в качестве обратного прокси, и используем Let’s Encrypt для обслуживания его через SSL.

Шаг 7 - Установка Nginx

Debian 12 поставляется со старой версией Nginx. Вам нужно загрузить официальный репозиторий Nginx, чтобы установить последнюю версию.

Импортируйте ключ подписи Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Добавьте репозиторий для основной версии Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Обновите системные репозитории.

$ sudo apt update

Установите Nginx.

$ sudo apt install nginx

Проверьте установку. На системах Debian следующая команда будет работать только с sudo.

$ sudo nginx -v
nginx version: nginx/1.25.5

Запустите сервер Nginx.

$ sudo systemctl start nginx

Проверьте статус службы.

$ sudo systemctl status nginx
? nginx.service - nginx - высокопроизводительный веб-сервер
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-05-03 03:04:02 UTC; 5s ago
       Docs: https://nginx.org/en/docs/
    Process: 1699 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 1700 (nginx)
      Tasks: 3 (limit: 2251)
     Memory: 2.9M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??1700 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??1701 "nginx: worker process"
             ??1702 "nginx: worker process"

May 03 03:04:02 meilisearch systemd[1]: Starting nginx.service - nginx - высокопроизводительный веб-сервер...
May 03 03:04:02 meilisearch systemd[1]: Started nginx.service - nginx - высокопроизводительный веб-сервер.

Шаг 8 - Установка SSL

Нам нужно установить Certbot для генерации SSL-сертификата. Вы можете установить Certbot, используя репозиторий Debian, или загрузить последнюю версию с помощью инструмента Snapd. Мы будем использовать версию Snapd.

Debian 12 не поставляется с установленным Snapd. Установите пакет Snapd.

$ sudo apt install -y snapd

Выполните следующие команды, чтобы убедиться, что ваша версия Snapd обновлена.

$ sudo snap install core && sudo snap refresh core

Установите Certbot.

$ sudo snap install --classic certbot

Используйте следующую команду, чтобы убедиться, что команда Certbot может быть выполнена, создав символическую ссылку в каталоге /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Проверьте, работает ли Certbot правильно.

$ certbot --version
certbot 2.10.0

Выполните следующую команду, чтобы сгенерировать SSL-сертификат.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d meilisearch.example.com

Вышеуказанная команда загрузит сертификат в каталог /etc/letsencrypt/live/meilisearch.example.com на вашем сервере.

Сгенерируйте сертификат группы Диффи-Хеллмана.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Проверьте список таймеров systemd. Certbot автоматически устанавливает и запускает таймер для целей обновления.

$ sudo systemctl list-timers

Вы найдете snap.certbot.renew.service как одну из запланированных служб.

NEXT                        LEFT           LAST                        PASSED    UNIT                        ACTIVATES                   ---------------------------------------------------------------------------------------------------------------------------------------  
Fri 2024-05-03 17:17:15 UTC 14h left      Fri 2024-05-03 02:54:42 UTC 11min ago apt-daily.timer              apt-daily.service
Fri 2024-05-03 06:42:20 UTC 3h 36min left Fri 2024-05-03 02:54:42 UTC 11min ago apt-daily-upgrade.timer      apt-daily-upgrade.service
Fri 2024-05-03 10:39:00 UTC 7h left       -                           -         snap.certbot.renew.timer     snap.certbot.renew.service

Проведите пробный запуск процесса, чтобы проверить, работает ли обновление SSL.

$ sudo certbot renew --dry-run

Если вы не видите ошибок, вы готовы. Ваш сертификат будет автоматически обновляться.

Шаг 9 - Настройка Nginx

Откройте файл /etc/nginx/nginx.conf для редактирования.

$ sudo nano /etc/nginx/nginx.conf

Добавьте следующую строку перед строкой include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Создайте и откройте файл /etc/nginx/conf.d/meilisearch.conf для редактирования.

$ sudo nano /etc/nginx/conf.d/meilisearch.conf

Вставьте следующий код в него. Замените meilisearch.example.com на ваше доменное имя.

server {

    listen 443 ssl;
    listen [::]:443 ssl;

    http2 on;
    http3 on;
    quic_retry on;

    server_name meilisearch.example.com;

    access_log  /var/log/nginx/meilisearch.access.log;
    error_log   /var/log/nginx/meilisearch.error.log;

    ssl_certificate      /etc/letsencrypt/live/meilisearch.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/meilisearch.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/meilisearch.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_early_data on;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://localhost:7700;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  meilisearch.example.com;
    return 301   https://$host$request_uri;
}

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Проверьте конфигурацию Nginx.

$ sudo nginx -t

Перезапустите сервер Nginx.

$ sudo systemctl restart nginx

Meilisearch теперь работает и доступен по URL https://meilisearch.example.com. Вы должны увидеть следующий текст, когда откроете URL.

{"status":"Meilisearch is running"}

Этот URL можно использовать только для поиска через командную строку. Если вы хотите получить доступ к Meilisearch через интерфейс, вам нужно будет интегрировать его с другой CMS или программным обеспечением, чтобы это работало, что выходит за рамки этого руководства. Meilisearch поставляется с встроенным интерфейсом, но он работает только в том случае, если вы используете его для целей разработки. Вы можете изменить среду экземпляра на development в файле конфигурации и перезапустить Meilisearch, чтобы активировать интерфейс. Он должен выглядеть примерно так.

Интерфейс поиска разработки Meilisearch

Для производственной среды вам нужно будет интегрировать Meilisearch с другой CMS.

Давайте начнем использовать его для индексации некоторых документов и поиска.

Шаг 10 - Загрузка образца данных в Meilisearch

Проект Meilisearch предоставляет образец файла в формате JSON с данными, собранными из The Movie Database (TMDB). Скачайте файл.

$ wget https://www.meilisearch.com/movies.json

Вы можете выполнить команду tail, чтобы увидеть часть данных. Это должно выглядеть следующим образом.

$ tail -n 3 movies.json

{"id":460070,"title":"J.T. LeRoy","overview":"Молодая женщина по имени Саванна Кноп проводит шесть лет, притворяясь трансгендерным писателем по имени JT Leroy, вымышленной литературной персоной своей свояченицы.","genres":["Драма"],"poster":"https://image.tmdb.org/t/p/w500/43ffZhMCWQhzMneGP4kDWoPV48X.jpg","release_date":1556236800},
{"id":460071,"title":"Lizzie","overview":"Массачусетс, 1892. Неженатая женщина 32 лет и социальный изгой, Лиззи живет в клаустрофобной жизни под холодным и властным контролем своего отца. Когда Бриджет Салливан, молодая горничная, приходит работать в семью, Лиззи находит сочувствующую, родственную душу, и тайная близость вскоре перерастает в коварный план.","genres":["Криминал","Драма","Триллер"],"poster":"https://image.tmdb.org/t/p/w500/z2iuBcwznen3kC9z4LeOzBSz1BB.jpg","release_date":1536883200}
]

Как вы можете видеть, каждая отдельная запись содержит id, заголовок, ссылку на изображение постера, обзор фильма, дату выхода и список жанров. Дата выхода находится в формате EPOCH.

Давайте загрузим данные в Meilisearch, используя curl через HTTP POST запрос.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/documents' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' \
  --data-binary @movies.json

Давайте пройдемся по аргументам команды:

  • -X POST - указывает, что мы выполняем HTTP POST запрос и отправляем данные.
  • -H Content-Type - указывает тип содержимого файла.
  • -H Authorization: Bearer - используется для передачи мастер-ключа с вашими запросами.
  • –data-binary - указывает файл, который будет включен.

Здесь мы создаем новый индекс Meilisearch по адресу /indexes/movies/documents. Вы должны получить аналогичный вывод, сообщающий вам, что запрос был поставлен в очередь. Meilisearch обрабатывает все запросы асинхронно.

{"taskUid":0,"indexUid":"movies","status":"enqueued","type":"documentAdditionOrUpdate","enqueuedAt":"2024-05-03T03:12:55.599798591Z"}

Вы также можете выполнить вышеуказанную команду, заменив URL http://localhost:7700 на https://meilisearch.example.com, и она будет работать так же. Вы можете сделать это для всех команд в этом руководстве, но для простоты мы будем придерживаться URL http://localhost:7700.

Выполните следующую команду, чтобы проверить статус запроса.

$ curl -X GET 'http://localhost:7700/indexes/movies/tasks/0'

Вы должны получить аналогичный вывод.

{"uid":0,"indexUid":"movies","status":"succeeded","type":"documentAddition","details":{"receivedDocuments":19547,"indexedDocuments":19546},"duration":"PT29.866920116S","enqueuedAt":"2024-05-03T03:13:18.233702815Z","startedAt":"2024-05-03T03:19:45.370142371Z","finishedAt":"2024-05-03T03:20:05.108395540Z"}

Это говорит нам о том, что задача завершена, и база данных фильмов теперь полностью индексирована и готова к использованию.

Шаг 11 - Использование ограниченных ключей для поиска

Есть один инструмент, который нам нужен, который помогает с читаемым форматированием JSON в командной строке. Он называется jq. Выполните следующую команду, чтобы установить его.

$ sudo apt install -y jq

Хотя мы добавили мастер-ключ в файл конфигурации, вам нужно будет передавать его снова с каждым запросом. Прежде чем продолжить, нам нужен более ограниченный ключ, который позволит режим только для чтения. Meilisearch по умолчанию создает ключ только для чтения. Давайте получим его.

$ curl -X GET 'http://localhost:7700/keys' -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' | jq

Вы должны увидеть аналогичный вывод.

{
  "results": [
    {
      "name": "Default Search API Key",
      "description": "Используйте его для поиска с фронтенда",
      "key": "591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a",
      "uid": "d004073b-b813-4016-82cb-7995df5149f6",
      "actions": [
        "search"
      ],
      "indexes": [
        "*"
      ],
      "expiresAt": null,
      "createdAt": "2024-05-03T03:02:53.887256411Z",
      "updatedAt": "2024-05-03T03:02:53.887256411Z"
    },
    {
      "name": "Default Admin API Key",
      "description": "Используйте его для всего, что не является операцией поиска. Осторожно! Не выставляйте его на публичном фронтенде",
      "key": "0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196",
      "uid": "b4fc2f96-4347-4750-9ba6-2da73c26e2bd",
      "actions": [
        "*"
      ],
      "indexes": [
        "*"
      ],
      "expiresAt": null,
      "createdAt": "2024-05-03T03:02:53.886580786Z",
      "updatedAt": "2024-05-03T03:02:53.886580786Z"
    }
  ],
  "offset": 0,
  "limit": 20,
  "total": 2
}

С этого момента мы будем использовать Default Search API key для выполнения поисков.

Шаг 12 - Поиск по образцу данных

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

Поиск через API аналогичен загрузке данных через HTTP POST запрос. Вы делаете запрос к конечной точке /search API. Например, давайте поищем любые фильмы со словом saint в названии.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "saint" }' | jq

Вы должны получить вывод, отформатированный в JSON, похожий на следующий.

{
  "hits": [
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "Эта канадская комедия/драма, действие которой происходит в Гамильтоне, Онтарио, в 1954 году, является милой и - временами - глупой историей, которая становится все более трогательной по мере того, как минуты идут. Это вымышленная история о сбившемся с пути девятикласснике, Ральфе (Адам Батчер), который тайно живет один, пока его вдовствующая, госпитализированная мать остается погруженной в кому. Часто попадая в неприятности к отцу Фицпатрику (Гордон Пинсент), директору своей католической школы для мальчиков, Ральф считается чем-то вроде шутки среди сверстников, пока не решает совершить чудо, которое может спасти его мать, т.е. выиграть Бостонский марафон. Под руководством молодого священника и бывшего бегуна, отца Хибберта (Кэмпбелл Скотт), чей цинизм был поднят чистой надеждой мальчика, Ральф прилагает усилия к своей маловероятной миссии, отбиваясь от скептиков и получая помощь на очень сложном пути от различных союзников и друзей.",
      "genres": [
        "Комедия",
        "Драма"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "В 1815 году монах, Томас Алькала, невольно освобождает двух женских суккубов, Мункар и Накира, на ничего не подозревающий 21-й век. Он избран Богом, чтобы путешествовать через века и остановить разрушение демонов.",
      "genres": [
        "Фэнтези",
        "Ужасы",
        "Научная фантастика",
        "Телевизионный фильм"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
    {
      "id": 27023,
      "title": "Saint John of Las Vegas",
      "overview": "Бывший азартный игрок снова втянут в игру опытным следователем по страховым мошенничествам.",
      "genres": [
        "Комедия"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/kN4Vur1SccouDR0k3tmJXJHdrXw.jpg",
      "release_date": 1264723200
    },
  ...

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

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "seint" }' | jq

Здесь мы неправильно написали saint как seint, и Meilisearch все равно вернет записи со словом saint.

{
  "hits": [
    {
      "id": 10105,
      "title": "Saints and Soldiers",
      "overview": "Пять американских солдат, сражающихся в Европе во время Второй мировой войны, пытаются вернуться на территорию союзников после того, как были отделены от сил США во время исторической резни в Мальмеди.",
      "genres": [
        "Война",
        "Драма",
        "Экшн",
        "Приключения",
        "История"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/efhqxap8fLi4v1GEXVvakey0z3S.jpg",
      "release_date": 1063238400
    },
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "Эта канадская комедия/драма, действие которой происходит в Гамильтоне, Онтарио, в 1954 году, является милой и - временами - глупой историей, которая становится все более трогательной по мере того, как минуты идут. Это вымышленная история о сбившемся с пути девятикласснике, Ральфе (Адам Батчер), который тайно живет один, пока его вдовствующая, госпитализированная мать остается погруженной в кому. Часто попадая в неприятности к отцу Фицпатрику (Гордон Пинсент), директору своей католической школы для мальчиков, Ральф считается чем-то вроде шутки среди сверстников, пока не решает совершить чудо, которое может спасти его мать, т.е. выиграть Бостонский марафон. Под руководством молодого священника и бывшего бегуна, отца Хибберта (Кэмпбелл Скотт), чей цинизм был поднят чистой надеждой мальчика, Ральф прилагает усилия к своей маловероятной миссии, отбиваясь от скептиков и получая помощь на очень сложном пути от различных союзников и друзей.",
      "genres": [
        "Комедия",
        "Драма"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "В 1815 году монах, Томас Алькала, невольно освобождает двух женских суккубов, Мункар и Накира, на ничего не подозревающий 21-й век. Он избран Богом, чтобы путешествовать через века и остановить разрушение демонов.",
      "genres": [
        "Фэнтези",
        "Ужасы",
        "Научная фантастика",
        "Телевизионный фильм"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
 …

Шаг 13 - Настройка ранжирования поиска и фильтрация данных

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

Но сначала нам нужно проверить правила ранжирования, установленные Meilisearch.

$ curl -X GET 'http://localhost:7700/indexes/movies/settings/ranking-rules' -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196'

Вы получите следующий вывод.

["words","typo","proximity","attribute","sort","exactness"]
  1. words - результаты сортируются по убыванию количества совпадающих терминов.
  2. typo - результаты сортируются по возрастанию количества опечаток. Меньше опечаток возвращается в верхней части.
  3. proximity - результаты сортируются по возрастанию расстояния между совпадающими терминами.
  4. attribute - результаты сортируются по порядку ранжирования атрибутов.
  5. sort - результаты сортируются в соответствии с параметрами, определенными во время запроса.
  6. exactness - результаты сортируются по сходству совпадающих слов с запросом.

Вы можете узнать больше о релевантности в официальной документации Meilisearch.

Выполните следующую команду, чтобы изменить порядок правил предвзятости.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings/ranking-rules' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '[
      "words",
      "typo",
      "proximity",
      "release_date:asc",
      "attribute",
      "sort",
      "exactness",
      "rank:desc"
  ]'

Теперь давайте отфильтруем результаты поиска. Сначала давайте попросим Meilisearch использовать только определенные атрибуты для выполнения поиска и оставить бесполезные атрибуты, такие как id, в стороне.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '{
      "searchableAttributes": [
          "title",
          "overview",
          "genres"
      ]
  }'

Здесь мы выполняем поиск, используя только атрибуты title, overview и genres, что даст лучшие результаты.

Далее мы можем отформатировать наши результаты поиска, чтобы отображать только определенные атрибуты, скрывая другие.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings/displayedAttributes' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '[
          "title",
          "overview",
          "genres",
          "release_date"
      ]'

Это будет показывать только атрибуты, которые мы включили в наш запрос с результатами.

Наконец, вы также можете предоставить список атрибутов для фильтрации или сортировки. Это включает как количественную фильтрацию с использованием математических операторов, таких как < или >, так и фильтрацию через включение в заданный набор. Это также называется фасетным поиском.

$ curl \
  -X PATCH 'http://localhost:7700/indexes/movies/settings' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '{
      "filterableAttributes": [
          "genres",
          "release_date"
      ],
      "sortableAttributes": [
          "release_date"
      ]
  }'

Мы можем комбинировать все эти правила, чтобы выполнить запрос, подобный следующему.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "house", "sort": ["release_date:desc"], "filter": "genres = Horror" }' | jq

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

{
  "hits": [
    {
      "id": 440559,
      "title": "Housesitters",
      "overview": "Энджи и Иззи получают работу по присмотру за домом, которая кажется слишком хорошей, чтобы быть правдой. Ужасные сверхъестественные проделки начинаются.",
      "genres": [
        "Комедия",
        "Ужасы"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/9Gnu0PBdYzyd7ZkO74XK0xCH0iY.jpg",
      "release_date": 1524873600
    },
    {
      "id": 449550,
      "title": "Housewife",
      "overview": "Housewife сосредоточен на Холли, чья мать убила ее сестру и отца, когда ей было семь лет. Спустя 20 лет и постепенно теряя контроль над разницей между реальностью и кошмарами, она сталкивается с известным психиком, который утверждает, что он предназначен, чтобы помочь ей.",
      "genres": [
        "Ужасы"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ohHxS7PIRQb9O6KTrDtqYshYGts.jpg",
      "release_date": 1504828800
    },
    {
      "id": 392703,
      "title": "House of Darkness",
      "overview": "Вдохновленный реальными событиями, сверхъестественный триллер "House of Darkness" рассказывает о загадочном случае семьи из Сан-Франциско, которая утверждала, что темная сила была ответственна за трагические события, которые произошли. Пытаясь спасти свой struggling брак, Келли (Сара Флетчер, "Взрослость"), ее муж Брайан (Ганнер Райт, "Дж. Эдгар") и их дочь Сара (Микайла Соун, "Избранное") переезжают в загородный дом в поисках спокойствия. Не подозревая, что почти каждая семья, которая жила в этом доме, страдала от какой-либо трагедии, начиная с почти 100 лет назад. Вскоре после их прибытия Келли начинает чувствовать, что поведение ее мужа становится все более странным и агрессивным. Келли также начинает осознавать, что голоса, которые она слышит, эхом раздаются по коридорам, не исходят от ее дочери. Будут ли Келли и ее семья следующими жертвами темных сил в доме?",
      "genres": [
        "Ужасы",
        "Триллер",
        "Телевизионный фильм"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ueQM9RsT0HLL2RuuiLmD07j8lKB.jpg",
      "release_date": 1460851200
    },
…

Шаг 14 - Заключение

Вы завершили установку и настройку Meilisearch в производственной среде на сервере Debian 12. Вы также выполнили некоторые базовые поиски и узнали, как улучшить результаты поиска с помощью ранжирования и фильтрации. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.