Cách cài đặt và cấu hình Meilisearch trên Debian 12

theanh

Administrator
Nhân viên
Meilisearch là một công cụ tìm kiếm mã nguồn mở được viết bằng ngôn ngữ Rust. Được viết bằng Rust đòi hỏi ít tài nguyên hơn để chạy và có thể chạy bằng một lệnh nhị phân dòng lệnh duy nhất. Quá trình cài đặt đơn giản hơn các công cụ tìm kiếm thay thế và yêu cầu ít bước hơn. Các tính năng của nó bao gồm khớp mờ và lập chỉ mục không có lược đồ. Nó đi kèm với giao diện web cho mục đích demo. Nó có thể được tích hợp vào nhiều ứng dụng web khác nhau thông qua nhiều thư viện có sẵn bằng nhiều ngôn ngữ như JavaScript, Python, PHP, Ruby, v.v.

Trong hướng dẫn này, bạn sẽ học cách cài đặt Meilisearch trong sản xuất trên máy chủ Debian 12 và sử dụng nó để thực hiện một số tìm kiếm đơn giản.

Điều kiện tiên quyết​


  • Một máy chủ chạy Debian 12 với tối thiểu 2GB RAM.

  • Một người dùng không phải root có quyền sudo.

  • Tường lửa đơn giản (UFW) được bật và đang chạy.

  • Một Tên miền đủ điều kiện (FQDN) như meilisearch.example.com trỏ đến máy chủ của bạn. Điều này có lợi nếu bạn muốn phục vụ Meilisearch qua SSL bằng máy chủ proxy.

  • Mọi thứ đều được cập nhật.
Mã:
$ sudo apt update && sudo apt upgrade

  • Một số gói thiết yếu là bắt buộc cho hướng dẫn. Một số trong số này có thể đã được cài đặt trên máy chủ của bạn.
    Mã:
    $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên trước khi cài đặt bất kỳ gói nào là cấu hình tường lửa để cho phép kết nối HTTP và HTTPS.

Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy nội dung tương tự như sau.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Cho phép các cổng HTTP và HTTPs.
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Kiểm tra lại trạng thái để xác nhận.
Mã:
$ 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)

Bước 2 - Cài đặt Meilisearch​

Có một số cách để cài đặt Meilisearch. Chúng tôi sẽ sử dụng phương pháp đơn giản nhất liên quan đến việc sao chép tệp nhị phân vào máy chủ của chúng tôi.

Cài đặt Meilisearch.
Mã:
$ curl -L https://install.meilisearch.com | sh
Tạo tệp nhị phân có thể thực thi.
Mã:
$ chmod +x meilisearch
Hiện tại, tệp nhị phân chỉ có thể sử dụng được từ thư mục mà bạn đã tải xuống. Để có thể sử dụng ở bất kỳ đâu, hãy di chuyển tệp nhị phân đến thư mục /usr/local/bin.
Mã:
$ sudo mv ./meilisearch /usr/local/bin/
Xác nhận rằng Meilisearch đã được cài đặt và đang chạy đúng cách.
Mã:
$ meilisearch --version
meilisearch 1.7.6

Bước 3 - Tạo người dùng hệ thống cho Meilisearch​

Chạy Meilisearch với tư cách root có thể gây ra các vấn đề về bảo mật. Để tránh chúng, hãy tạo một người dùng hệ thống để chạy Meilisearch.
Mã:
$ sudo useradd -d /var/lib/meilisearch -b /bin/false -m -r meilisearch

Bước 4 - Cấu hình Meilisearch​

Trước khi tiếp tục, chúng ta cần tạo một khóa chính mà Meilisearch sử dụng cho quy trình xác thực. Bạn có thể sử dụng tiện ích dòng lệnh OpenSSL để tạo khóa chính. Chạy lệnh sau để tạo khóa chính dài 30 ký tự. Bạn có thể chọn bất kỳ độ dài nào cho khóa chính của mình. Càng dài càng tốt.
Mã:
$ openssl rand -hex 30
Bạn sẽ nhận được kết quả tương tự với khóa dài 30 ký tự. Sao chép giá trị này vì chúng ta sẽ cần nó trong các bước tiếp theo.
Mã:
65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611
Lấy tệp cấu hình mới nhất từ kho lưu trữ GitHub của Meilisearch và sao chép vào /etc thư mục.
Mã:
$ sudo sh -c 'curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml'
Mở để chỉnh sửa.
Mã:
$ sudo nano /etc/meilisearch.toml
Cập nhật các dòng sau trong tệp để cấu hình đường dẫn cơ sở dữ liệu, đường dẫn dump, thư mục ảnh chụp nhanh và môi trường làm việc, đồng thời thêm khóa chính mà bạn đã tạo trước đó để xác thực.

Các giá trị được cập nhật trong tệp cấu hình sẽ trông giống như sau.
Mã:
env = "production"
master_key = "173e95f077590ed33dad89247247be8d8ce8b6722ccc87829aaefe3207be"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"
Meilisearch thu thập dữ liệu thường xuyên một cách ẩn danh. Bạn nên tắt nó bằng tùy chọn sau. Bỏ ghi chú để hủy kích hoạt phép đo từ xa của Meilisearch.
Mã:
no_analytics = true
Theo mặc định, Meilisearch sử dụng không quá hai phần ba RAM khả dụng trên hệ thống của bạn. Bạn có thể kiểm soát điều này bằng cách bỏ ghi chú và đặt biến sau. Bạn cũng có thể chỉ định giá trị là số byte chính xác để đảm bảo độ chính xác và chính xác.
Mã:
max_indexing_memory = "1 GiB"
Meilisearch chỉ sử dụng không quá một nửa số lõi CPU khả dụng. Tuy nhiên, bạn có thể kiểm soát giá trị này bằng cách bỏ chú thích và thiết lập biến sau.
Mã:
max_indexing_threads = 1
Thiết lập giá trị này lớn hơn số lõi CPU của máy sẽ yêu cầu Meilisearch sử dụng số lõi khả dụng tối đa.

Một thiết lập nữa mà bạn nên biết là lượng tải trọng tối đa mà Meilisearch có thể tiếp nhận. Giá trị mặc định được đặt ở mức 100MB. Bạn có thể thay đổi bằng cách cấu hình biến sau.
Mã:
http_payload_size_limit = "100 MB"
Sau khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 5 - Tạo thư mục và cấp quyền​

Tạo các thư mục mà Meilisearch sẽ lưu trữ cơ sở dữ liệu, bản sao lưu cơ sở dữ liệu và ảnh chụp nhanh.
Mã:
$ sudo mkdir /var/lib/meilisearch/dumps -p
$ sudo mkdir /var/lib/meilisearch/snapshots
Đặt chủ sở hữu và nhóm trên các thư mục này thành người dùng hệ thống mà chúng tôi đã tạo cho Meilisearch.
Mã:
$ sudo chown -R meilisearch:meilisearch /var/lib/meilisearch
Đặt chủ sở hữu và nhóm trên nhị phân Meilisearch file.
Mã:
$ sudo chown meilisearch:meilisearch /usr/local/bin/meilisearch
Thiết lập quyền thích hợp cho thư mục.
Mã:
$ sudo chmod 750 /var/lib/meilisearch

Bước 6 - Chạy Meilisearch dưới dạng dịch vụ​

Để Meilisearch luôn sẵn sàng cho các yêu cầu tìm kiếm, tốt hơn là chạy nó dưới dạng dịch vụ hệ thống. Để thực hiện việc này, chúng ta cần tạo một tệp dịch vụ cho nó.

Tạo và mở /etc/systemd/system/meilisearch.service để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/meilisearch.service
Dán mã sau vào nó.
Mã:
[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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Kích hoạt dịch vụ.
Mã:
$ sudo systemctl enable meilisearch
Khởi động Meilisearch dịch vụ.
Mã:
$ sudo systemctl start meilisearch
Kiểm tra trạng thái dịch vụ
Mã:
$ sudo systemctl status meilisearch
Bạn sẽ nhận được kết quả tương tự.
Mã:
? 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 đã được cài đặt và đang chạy. Chúng ta hãy đưa dịch vụ ra bên ngoài bằng cách sử dụng máy chủ Nginx làm proxy ngược và sử dụng Let's Encrypt để phục vụ dịch vụ này qua SSL.

Bước 7 - Cài đặt Nginx​

Debian 12 đi kèm với phiên bản Nginx cũ hơn. Bạn cần tải xuống kho lưu trữ Nginx chính thức để cài đặt phiên bản mới nhất.

Nhập khóa ký của Nginx.
Mã:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Thêm kho lưu trữ cho phiên bản chính của Nginx.
Mã:
$ 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
Cập nhật hệ thống kho lưu trữ.
Mã:
$ sudo apt update
Cài đặt Nginx.
Mã:
$ sudo apt install nginx
Xác minh cài đặt. Trên hệ thống Debian, lệnh sau chỉ hoạt động với sudo.
Mã:
$ sudo nginx -v
nginx version: nginx/1.25.5
Khởi động Nginx máy chủ.
Mã:
$ sudo systemctl start nginx
Kiểm tra trạng thái dịch vụ.
Mã:
$ 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.

Bước 8 - Cài đặt SSL​

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL. Bạn có thể cài đặt Certbot bằng kho lưu trữ của Debian hoặc tải phiên bản mới nhất bằng công cụ Snapd. Chúng tôi sẽ sử dụng phiên bản Snapd.

Debian 12 không đi kèm Snapd đã cài đặt. Cài đặt gói Snapd.
Mã:
$ sudo apt install -y snapd
Chạy các lệnh sau để đảm bảo phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core && sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo lệnh Certbot có thể chạy được bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Kiểm tra xem Certbot có hoạt động bình thường không.
Mã:
$ certbot --version
certbot 2.10.0
Chạy lệnh sau để tạo SSL Giấy chứng nhận.
Mã:
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d meilisearch.example.com
Lệnh trên sẽ tải xuống chứng chỉ vào thư mục /etc/letsencrypt/live/meilisearch.example.com trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Kiểm tra danh sách bộ đếm thời gian systemd. Certbot tự động cài đặt và bắt đầu bộ đếm thời gian cho mục đích gia hạn.
Mã:
$ sudo systemctl list-timers
Bạn sẽ thấy snap.certbot.renew.service là một trong những dịch vụ được lên lịch chạy.
Mã:
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
Thực hiện chạy thử quy trình để kiểm tra xem quá trình gia hạn SSL có hoạt động tốt không.
Mã:
$ sudo certbot renew --dry-run
Nếu không thấy lỗi nào, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Bước 9 - Cấu hình Nginx​

Mở tệp /etc/nginx/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/nginx.conf
Thêm dòng sau vào trước dòng include /etc/nginx/conf.d/*.conf;.
Mã:
server_names_hash_bucket_size 64;
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tạo và mở tệp /etc/nginx/conf.d/meilisearch.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/conf.d/meilisearch.conf
Dán mã sau vào đó. Thay thế meilisearch.example.com bằng tên miền của bạn.
Mã:
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;
}
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Xác minh Nginx của bạn cấu hình.
Mã:
$ sudo nginx -t
Khởi động lại máy chủ Nginx.
Mã:
$ sudo systemctl restart nginx
Meilisearch hiện đang chạy và có sẵn thông qua URL https://meilisearch.example.com. Bạn sẽ thấy văn bản sau khi mở URL.
Mã:
{"status":"Meilisearch is running"}
URL này chỉ có thể được sử dụng để tìm kiếm thông qua dòng lệnh. Nếu bạn muốn truy cập Meilisearch thông qua giao diện người dùng, bạn sẽ cần tích hợp nó với một CMS hoặc phần mềm khác để làm cho nó hoạt động, phạm vi của nó nằm ngoài hướng dẫn này. Meilisearch được tích hợp sẵn giao diện frontend nhưng giao diện này chỉ hoạt động nếu bạn sử dụng cho mục đích phát triển. Bạn có thể thay đổi môi trường của phiên bản thành development trong tệp cấu hình và khởi động lại Meilisearch để kích hoạt giao diện. Nó sẽ trông giống như sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22371%22%3E%3C/svg%3E


Đối với môi trường sản xuất, bạn sẽ cần tích hợp Meilisearch với một CMS khác.

Chúng ta hãy bắt đầu sử dụng nó để lập chỉ mục một số tài liệu và sử dụng nó để tìm kiếm.

Bước 10 - Tải dữ liệu mẫu vào Meilisearch​

Dự án Meilisearch cung cấp một tệp phim định dạng JSON mẫu với dữ liệu được trích xuất từ Cơ sở dữ liệu phim (TMDB). Tải tệp xuống.
Mã:
$ wget https://www.meilisearch.com/movies.json
Bạn có thể chạy lệnh tail để xem một phần dữ liệu. Nó sẽ trông như sau.
Mã:
$ 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}
]
Như bạn thấy, mỗi mục riêng lẻ đều chứa id, tiêu đề, liên kết đến hình ảnh áp phích, tổng quan về bộ phim, ngày phát hành và danh sách thể loại. Ngày phát hành ở định dạng EPOCH.

Chúng ta hãy tải dữ liệu vào Meilisearch bằng curl thông qua yêu cầu HTTP POST.
Mã:
$ curl \ -X POST 'http://localhost:7700/indexes/movies/documents' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' \ --data-binary @movies.json
Chúng ta hãy xem qua các đối số lệnh:
  • -X POST - chỉ định rằng chúng ta đang thực hiện yêu cầu HTTP POST và gửi dữ liệu.
  • -H Content-Type - chỉ định loại nội dung tệp.
  • -H Authorization: Bearer - là truyền khóa chính cùng với các yêu cầu của bạn.
  • --data-binary - chỉ định tệp sẽ được đưa vào.
Tại đây chúng tôi đang tạo một chỉ mục Meilisearch mới tại vị trí /indexes/movies/documents. Bạn sẽ nhận được thông báo tương tự cho biết yêu cầu đã được xếp hàng. Meilisearch xử lý tất cả các yêu cầu theo cách không đồng bộ.
Mã:
{"taskUid":0,"indexUid":"movies","status":"enqueued","type":"documentAdditionOrUpdate","enqueuedAt":"2024-05-03T03:12:55.599798591Z"}
Bạn cũng có thể chạy lệnh trên bằng cách thay thế URL http://localhost:7700 bằng https://meilisearch.example.com và nó sẽ hoạt động theo cách tương tự. Bạn có thể làm như vậy đối với tất cả các lệnh trong hướng dẫn này nhưng để đơn giản, chúng tôi sẽ sử dụng URL http://localhost:7700.

Chạy lệnh sau để kiểm tra trạng thái của yêu cầu.
Mã:
$ curl -X GET 'http://localhost:7700/indexes/movies/tasks/0'
Bạn sẽ nhận được thông báo tương tự đầu ra.
Mã:
{"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"}
Điều này cho chúng ta biết rằng nhiệm vụ đã hoàn thành và cơ sở dữ liệu phim hiện đã được lập chỉ mục đầy đủ và sẵn sàng để sử dụng.

Bước 11 - Sử dụng Khóa giới hạn để Tìm kiếm​

Chúng ta cần một công cụ giúp định dạng JSON dòng lệnh dễ đọc. Nó được gọi là jq. Chạy lệnh sau để cài đặt nó.
Mã:
$ sudo apt install -y jq
Mặc dù chúng tôi đã thêm khóa chính vào tệp cấu hình, bạn sẽ cần phải truyền lại khóa đó với mỗi yêu cầu. Trước khi tiếp tục, chúng tôi cần một khóa hạn chế hơn sẽ kích hoạt chế độ chỉ đọc. Meiliserch tạo một khóa chỉ đọc mặc định theo mặc định. Chúng ta hãy nắm bắt nó.
Mã:
$ curl -X GET 'http://localhost:7700/keys' -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' | jq
Bạn sẽ thấy kết quả tương tự.
Mã:
{ "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
}
Từ bây giờ, chúng ta sẽ sử dụng Khóa API tìm kiếm mặc định để thực hiện tìm kiếm.

Bước 12 - Tìm kiếm qua Dữ liệu mẫu​

Có hai cách để tìm kiếm bằng Meilisearch, bạn có thể sử dụng API thông qua dòng lệnh hoặc sử dụng giao diện web. Giao diện web khá hạn chế và chỉ hoạt động nếu bạn sử dụng Meilisearch trong môi trường phát triển và API là cách được khuyến nghị để sử dụng Meilisearch. Vì chúng tôi đã cấu hình tìm kiếm cho sản xuất, chúng tôi sẽ chỉ sử dụng phương pháp dòng lệnh.

Tìm kiếm qua API giống như tải dữ liệu lên qua yêu cầu HTTP POST. Bạn gửi yêu cầu đến điểm cuối /search của API. Ví dụ, hãy tìm kiếm bất kỳ bộ phim nào có chứa từ saint.
Mã:
$ curl \ -X POST 'http://localhost:7700/indexes/movies/search' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \ --data-binary '{ "q": "saint" }' | jq
Bạn sẽ nhận được kết quả đầu ra được định dạng theo JSON như sau sau đây.
Mã:
{ "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 }, ...
Để kiểm tra tính năng khớp mờ của Meilisearch trong đó các từ có âm thanh tương tự có thể được sử dụng để tìm kiếm chính xác. Điều này hữu ích trong trường hợp bạn đánh máy sai và vẫn mong đợi kết quả đúng.
Mã:
$ curl \ -X POST 'http://localhost:7700/indexes/movies/search' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \ --data-binary '{ "q": "seint" }' | jq
Ở đây, chúng tôi đã viết sai chính tả saint thành seint và Meilisearch vẫn sẽ trả về các mục có từ saint.
Mã:
{ "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 }, …

Bước 13 - Điều chỉnh thứ hạng tìm kiếm và lọc dữ liệu​

Các công cụ tìm kiếm có thể trả về kết quả tốt hơn nếu chúng biết cách xếp hạng hoặc coi trọng một số kết quả nhất định dựa trên tầm quan trọng của một lĩnh vực cụ thể. Meilisearch có một bộ quy tắc thiên vị mặc định mà bạn có thể cấu hình để cải thiện kết quả tìm kiếm của mình.

Nhưng trước tiên, chúng ta cần kiểm tra các quy tắc xếp hạng do Meilisearch đặt ra.
Mã:
$ curl -X GET 'http://localhost:7700/indexes/movies/settings/ranking-rules' -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196'
Bạn sẽ nhận được kết quả sau.
Mã:
["words","typo","proximity","attribute","sort","exactness"]
  1. từ - kết quả được sắp xếp theo số lượng từ khớp giảm dần terms.
  2. typo - kết quả được sắp xếp theo cách tăng số lỗi đánh máy. Ít truy vấn lỗi đánh máy được trả về ở đầu.
  3. proximity - kết quả được sắp xếp theo cách tăng khoảng cách giữa các thuật ngữ khớp.
  4. attribute - kết quả được sắp xếp theo thứ hạng thuộc tính.
  5. sort - kết quả được sắp xếp theo các tham số được quyết định tại thời điểm truy vấn.
  6. exactness - kết quả được sắp xếp theo mức độ tương tự của các từ khớp với các từ truy vấn.
Bạn có thể đọc thêm về mức độ liên quan trong tài liệu chính thức của Meilisearch.

Phát hành lệnh sau để thay đổi thứ tự quy tắc độ lệch.
Mã:
$ 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" ]'
Bây giờ chúng ta hãy lọc kết quả tìm kiếm. Đầu tiên, chúng ta hãy yêu cầu Meilisearch chỉ sử dụng một số thuộc tính nhất định để thực hiện tìm kiếm và bỏ qua các thuộc tính vô nghĩa như id.
Mã:
$ curl \ -X POST 'http://localhost:7700/indexes/movies/settings' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \ --data-binary '{ "searchableAttributes": [ "title", "overview", "genres" ] }'
Ở đây, chúng ta chỉ thực hiện tìm kiếm bằng cách sử dụng title, overviewgenres các thuộc tính sẽ mang lại kết quả tốt hơn.

Tiếp theo, chúng ta có thể định dạng kết quả tìm kiếm để chỉ hiển thị một số thuộc tính nhất định trong khi ẩn các thuộc tính khác.
Mã:
$ 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" ]'
Điều này sẽ chỉ hiển thị các thuộc tính mà chúng tôi đã đưa vào truy vấn của mình cùng với kết quả.

Cuối cùng, bạn cũng có thể cung cấp danh sách các thuộc tính cần lọc hoặc sắp xếp. Điều này bao gồm cả lọc định lượng bằng các toán tử toán học như < hoặc > và lọc thông qua việc đưa vào một tập hợp đã chỉ định. Đây cũng được gọi là tìm kiếm theo mặt.
Mã:
$ 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" ] }'
Chúng ta có thể kết hợp tất cả các quy tắc này để thực hiện truy vấn như sau.
Mã:
$ 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
Ở đây chúng ta đang tìm kiếm tất cả các bộ phim thuộc thể loại Kinh dị từ phim mới nhất đến phim cũ nhất có chứa từ house trong tiêu đề. Bạn sẽ nhận được kết quả tương tự.
Mã:
{ "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 },
…

Bước 14 - Kết luận​

Bạn đã hoàn tất cài đặt và cấu hình Meilisearch trong môi trường sản xuất trên máy chủ Debian 12. Bạn cũng đã thực hiện một số tìm kiếm cơ bản và tìm hiểu cách cải thiện kết quả tìm kiếm thông qua xếp hạng và lọc. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng vào phần bình luận bên dưới.
 
Back
Bên trên