Как установить и настроить Meilisearch в Debian 12
На этой странице
- Предварительные условия
- Шаг 1. Настройка брандмауэра
- Шаг 2 — Установите Meilisearch
- Шаг 3. Создайте системного пользователя для Meilisearch.
- Шаг 4. Настройте Meilisearch
- Шаг 5. Создайте каталоги и предоставьте разрешения.
- Шаг 6. Запустите Meilisearch как службу
- Шаг 7 — Установите Nginx
- Шаг 8 — Установите SSL
- Шаг 9 — Настройка Nginx
- Шаг 10. Загрузка образцов данных в Meilisearch
- Шаг 11. Используйте ограниченные ключи для поиска
- Шаг 12. Поиск по выборочным данным
- Шаг 13. Настройка поискового рейтинга и фильтрация данных
- Шаг 14 — Заключение
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
Вы должны увидеть что-то вроде следующего.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Разрешите порты HTTP и HTTPs.
$ sudo ufw allow http
$ sudo ufw allow https
Проверьте статус еще раз для подтверждения.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (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
Установите Нгинкс.
$ 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 - high performance web server
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 - high performance web server...
May 03 03:04:02 meilisearch systemd[1]: Started nginx.service - nginx - high performance web server.
Шаг 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
Установите Сертбот.
$ 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 -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 с другой CMS.
Давайте начнем использовать его для индексации некоторых документов и использования для поиска.
Шаг 10. Загрузка образцов данных в Meilisearch
Проект Meilisearch предоставляет образец файла фильма в формате JSON с данными, взятыми из базы данных фильмов (TMDB). Загрузите файл.
$ wget https://www.meilisearch.com/movies.json
Вы можете запустить команду Tail, чтобы увидеть часть данных. Это должно выглядеть следующим образом.
$ tail -n 3 movies.json
{"id":460070,"title":"J.T. LeRoy","overview":"A young woman named Savannah Knoop spends six years pretending to be a transgender writer named JT Leroy, the made-up literary persona of her sister-in-law.","genres":["Drama"],"poster":"https://image.tmdb.org/t/p/w500/43ffZhMCWQhzMneGP4kDWoPV48X.jpg","release_date":1556236800},
{"id":460071,"title":"Lizzie","overview":"Massachusetts, 1892. An unmarried woman of 32 and a social outcast, Lizzie lives a claustrophobic life under her father's cold and domineering control. When Bridget Sullivan, a young maid, comes to work for the family, Lizzie finds a sympathetic, kindred spirit, and a secret intimacy soon blossoms into a wicked plan.","genres":["Crime","Drama","Thriller"],"poster":"https://image.tmdb.org/t/p/w500/z2iuBcwznen3kC9z4LeOzBSz1BB.jpg","release_date":1536883200}
]
Как видите, каждая отдельная запись содержит идентификатор, заголовок, ссылку на постер, обзор фильма, дату выхода и список жанров. Дата выпуска указана в формате 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 Авторизация: Носитель — передача мастер-ключа вместе с вашими запросами.
- --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
Несмотря на то, что мы добавили мастер-ключ в файл конфигурации, вам придется передавать его заново при каждом запросе. Прежде чем двигаться дальше, нам нужен более ограниченный ключ, который включит режим только для чтения. Meiliserch по умолчанию создает ключ только для чтения. Давайте возьмем его.
$ curl -X GET 'http://localhost:7700/keys' -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' | jq
Вы должны увидеть аналогичный результат.
{
"results": [
{
"name": "Default Search API Key",
"description": "Use it to search from the frontend",
"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": "Use it for anything that is not a search operation. Caution! Do not expose it on a public frontend",
"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
}
С этого момента мы будем использовать ключ API поиска по умолчанию для выполнения поиска.
Шаг 12. Поиск по выборочным данным
Существует два способа поиска с помощью Meilisearch: вы можете использовать API через командную строку или использовать веб-интерфейс. Веб-интерфейс довольно ограничен и работает только в том случае, если вы используете Meilisearch в среде разработки, а API — рекомендуемый способ использования Meilisearch. Поскольку мы настроили поиск для производства, мы будем использовать только метод командной строки.
Поиск через API аналогичен загрузке данных через запрос HTTP POST. Вы делаете запрос к конечной точке /search
API. Например, давайте найдем любые фильмы, в которых есть слово святой
.
$ 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": "This Canadian made comedy/drama, set in Hamilton, Ontario in 1954, is a sweet and - at times - goofy story that becomes increasingly poignant as the minutes tick by. It's the fictional tale of a wayward 9th grader, Ralph (Adam Butcher), who is secretly living on his own while his widowed, hospitalized mother remains immersed in a coma. Frequently in trouble with Father Fitzpatrick (Gordon Pinsent), the principal of his all-boys, Catholic school, Ralph is considered something of a joke among peers until he decides to pull off a miracle that could save his mother, i.e., winning the Boston Marathon. Coached by a younger priest and former runner, Father Hibbert (Campbell Scott), whose cynicism has been lifted by the boy's pure hope, Ralph applies himself to his unlikely mission, fending off naysayers and getting help along a very challenging path from sundry allies and friends.",
"genres": [
"Comedy",
"Drama"
],
"poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
"release_date": 1123200000
},
{
"id": 26894,
"title": "Saint Sinner",
"overview": "In 1815 a monk, Tomas Alcala, unwittingly unleashes two female succubi, Munkar and Nakir, upon an unsuspecting 21st century. He is chosen by God to travel through the centuries and stop the demons' rampage.",
"genres": [
"Fantasy",
"Horror",
"Science Fiction",
"TV Movie"
],
"poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
"release_date": 1035590400
},
{
"id": 27023,
"title": "Saint John of Las Vegas",
"overview": "An ex-gambler is lured back into the game by a veteran insurance-fraud investigator.",
"genres": [
"Comedy"
],
"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": "Five American soldiers fighting in Europe during World War II struggle to return to Allied territory after being separated from U.S. forces during the historic Malmedy Massacre.",
"genres": [
"War",
"Drama",
"Action",
"Adventure",
"History"
],
"poster": "https://image.tmdb.org/t/p/w500/efhqxap8fLi4v1GEXVvakey0z3S.jpg",
"release_date": 1063238400
},
{
"id": 25248,
"title": "Saint Ralph",
"overview": "This Canadian made comedy/drama, set in Hamilton, Ontario in 1954, is a sweet and - at times - goofy story that becomes increasingly poignant as the minutes tick by. It's the fictional tale of a wayward 9th grader, Ralph (Adam Butcher), who is secretly living on his own while his widowed, hospitalized mother remains immersed in a coma. Frequently in trouble with Father Fitzpatrick (Gordon Pinsent), the principal of his all-boys, Catholic school, Ralph is considered something of a joke among peers until he decides to pull off a miracle that could save his mother, i.e., winning the Boston Marathon. Coached by a younger priest and former runner, Father Hibbert (Campbell Scott), whose cynicism has been lifted by the boy's pure hope, Ralph applies himself to his unlikely mission, fending off naysayers and getting help along a very challenging path from sundry allies and friends.",
"genres": [
"Comedy",
"Drama"
],
"poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
"release_date": 1123200000
},
{
"id": 26894,
"title": "Saint Sinner",
"overview": "In 1815 a monk, Tomas Alcala, unwittingly unleashes two female succubi, Munkar and Nakir, upon an unsuspecting 21st century. He is chosen by God to travel through the centuries and stop the demons' rampage.",
"genres": [
"Fantasy",
"Horror",
"Science Fiction",
"TV Movie"
],
"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"]
- слова — результаты сортируются по уменьшению количества совпадающих терминов.
- опечатка — результаты сортируются по возрастанию количества опечаток. Вверху возвращается меньше запросов с опечатками.
- близость — результаты сортируются по увеличению расстояния между совпадающими терминами.
- атрибут — результаты сортируются по порядку ранжирования атрибутов.
- сортировка — результаты сортируются в соответствии с параметрами, заданными во время запроса.
- Точность — результаты сортируются по сходству совпавших слов со словами запроса.
Подробнее об релевантности можно прочитать в официальной документации 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
Здесь мы ищем все фильмы в жанре Ужасы от самых новых до самых старых, содержащих в названии слово дом
. Вы должны получить аналогичный результат.
{
"hits": [
{
"id": 440559,
"title": "Housesitters",
"overview": "Angie and Izzy get a housesitting gig that seems too good to be true. Gruesome supernatural hijinks ensue.",
"genres": [
"Comedy",
"Horror"
],
"poster": "https://image.tmdb.org/t/p/w500/9Gnu0PBdYzyd7ZkO74XK0xCH0iY.jpg",
"release_date": 1524873600
},
{
"id": 449550,
"title": "Housewife",
"overview": "Housewife is centered on Holly whose mother murdered her sister and father when she was seven. 20 years later and slowly losing her grip on the difference between reality and nightmares, she runs into a celebrity psychic who claims that he is destined to help her.",
"genres": [
"Horror"
],
"poster": "https://image.tmdb.org/t/p/w500/ohHxS7PIRQb9O6KTrDtqYshYGts.jpg",
"release_date": 1504828800
},
{
"id": 392703,
"title": "House of Darkness",
"overview": "Inspired by true events, the supernatural thriller \"House of Darkness\" recounts the mysterious case of a San Francisco family who claimed that a dark force was responsible for the tragic events that unfolded. Trying to save their struggling marriage Kelly (Sara Fletcher, \"Adulthood\"), her husband Brian (Gunner Wright, \"J. Edgar\") and their daughter Sarah (Mykayla Sohn, \"The Chosen\") move to a rural farmhouse in search of some serenity. Unbeknownst to them, nearly every family that has lived in the house has suffered some form of tragedy, dating back nearly 100 years. Shortly after their arrival, Kelly begins to sense that her husband’s behavior is growing increasingly strange and violent. Kelly also comes to discover the voices she’s hearing echoing through the halls, are not coming from her daughter. Will Kelly and her family be the next victims of the dark forces in the house?",
"genres": [
"Horror",
"Thriller",
"TV Movie"
],
"poster": "https://image.tmdb.org/t/p/w500/ueQM9RsT0HLL2RuuiLmD07j8lKB.jpg",
"release_date": 1460851200
},
…
Шаг 14 — Заключение
Вы завершили установку и настройку Meilisearch в производственной среде на сервере Debian 12. Вы также выполнили базовый поиск и узнали, как улучшить результаты поиска посредством ранжирования и фильтрации. Если у вас есть вопросы, задавайте их в комментариях ниже.