如何在 Debian 12 上安装和配置 Meil​​isearch

如何在 Debian 12 上安装和配置 Meil​​isearch

Meilisearch 是一个用 Rust 语言编写的开源搜索引擎。 使用 Rust 编写需要更少的资源来运行,并且可以使用单个命令行二进制文件运行。 安装过程比其他搜索引擎更简单,并且需要的步骤更少。 其功能包括模糊匹配和无模式索引。 它带有一个用于演示目的的网络前端。 它可以通过 JavaScript、Python、PHP、Ruby 等多种语言的各种库集成到各种 Web 应用程序中。

在本教程中,您将学习如何在 Debian 12 服务器上安装 Meil​​isearch 并使用它来执行一些简单的搜索。

先决条件

  • 运行 Debian 12 且 RAM 至少为 2GB 的服务器。

  • 具有 sudo 权限的非 root 用户。

  • 简单的防火墙(UFW)已启用并正在运行。

  • 完全合格的域名 (FQDN),例如 meilisearch.example.com 指向您的服务器。 如果您想使用代理服务器通过 SSL 为 Meil​​isearch 提供服务,这将非常有用。

  • 一切都更新了。

    $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的方法。 我们将使用最简单的方法,将二进制文件复制到我们的服务器。

安装美丽搜索。

$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 – 为美丽搜索创建系统用户

以 root 身份运行 Meil​​isearch 可能会产生安全问题。 为了避免它们,请创建一个用于运行Meilisearch的系统用户。

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

步骤 4 – 配置美丽搜索

在继续之前,我们需要创建 Meil​​isearch 用于身份验证过程的主密钥。 您可以使用 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"

美力搜索匿名收集常规数据。 您应该使用以下选项禁用它。 取消注释以停用 Meil​​isearch 的遥测。

no_analytics = true

默认情况下,Meilisearch 使用的系统内存不超过三分之二。 您可以通过取消注释并设置以下变量来控制它。 您还可以将该值指定为精确的字节数,以确保精确和准确。

max_indexing_memory = "1 GiB"

Meilisearch 使用的可用 CPU 核心不超过一半。 但是,您可以通过取消注释并设置以下变量来控制该值。

max_indexing_threads = 1

将此值设置为大于机器的CPU核心数将告诉Meilisearch使用最大可用核心数。

您应该了解的另一项设置是Meilisearch 可以承受的最大有效负载量。 默认值设置为 100MB。 您可以通过配置以下变量来更改它。

http_payload_size_limit = "100 MB"

完成后,按 Ctrl + X 并在出现提示时输入 Y 来保存文件。

第 5 步 – 创建目录并授予权限

创建 Meil​​isearch 将存储其数据库、数据库暴跌和快照的目录。

$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 步 – 将 Meil​​isearch 作为服务运行

为了使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

启动美丽搜索服务。

$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 - 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 证书。 您可以使用 Debian 的存储库安装 Certbot,也可以使用 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 protected] -d meilisearch.example.com

上述命令将下载证书到 /etc/letsencrypt/live/meilisearch.example.com 您服务器上的目录。

生成 Diffie-Hellman 组证书。

$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项目提供了一个示例 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}
]

正如您所看到的,每个单独的条目都包含一个 ID、一个标题、海报图像的链接、电影概述、发行日期和流派列表。 发布日期采用 EPOCH 格式。

让我们使用curl 通过HTTP POST 请求将数据加载到Meilisearch 中。

$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:7700https://meilisearch.example.com 它也会以同样的方式工作。 您可以对本教程中的所有命令执行此操作,但为了简单起见,我们将坚持 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 步 – 搜索示例数据

使用美丽搜索有两种方式进行搜索,您可以通过命令行使用 API,也可以使用 Web 界面。 Web 界面相当有限,只有在开发环境中使用 Meil​​isearch 时才有效,并且建议使用 API 方式使用 Meil​​isearch。 由于我们已经配置了生产搜索,因此我们将仅使用命令行方法。

通过 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": "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
    },
  ...

测试美丽搜索的模糊匹配功能,可以使用相似的发音词来找到精确的搜索。 如果您输入错误但仍期望得到正确的结果,这会很有帮助。

$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 并且美丽搜索仍然会返回包含该词的条目 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 有一组默认的偏见规则,您可以配置它们来改善搜索结果。

但首先我们需要查看美丽搜索设定的排名规则。

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

您将得到以下输出。

["words","typo","proximity","attribute","sort","exactness"]
  1. 单词 – 结果按匹配术语的数量递减排序。
  2. 拼写错误 – 结果通过增加拼写错误的数量进行排序。 顶部返回的拼写错误查询较少。
  3. 邻近度 – 通过增加匹配项之间的距离对结果进行排序。
  4. 属性 – 结果按属性排名顺序排序。
  5. 排序 – 根据查询时决定的参数对结果进行排序。
  6. 精确性 – 结果按匹配词与查询词的相似度排序。

您可以在美丽搜索官方文档中阅读有关相关性的更多信息。

发出以下命令来更改偏置规则顺序。

$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"
  ]'

现在让我们过滤搜索结果。 首先,让我们要求美丽搜索仅使用某些属性来执行搜索,并忽略无意义的属性,例如 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, overviewgenres 属性将带来更好的结果。

接下来,我们可以将搜索结果格式化为仅显示某些属性,同时隐藏其他属性。

$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": "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 步 – 结论

您已经在 Debian 12 服务器上的生产环境中完成了 Meil​​isearch 的安装和配置。 您还执行了一些基本搜索,并了解了如何通过排名和过滤来改进搜索结果。 如果您有任何疑问,请在下面的评测中发表。

资讯来源:由0x资讯编译自HOWTOFORGE,版权归作者所有,未经许可,不得转载

资讯来源:由a0资讯编译自THECOINREPUBLIC。版权归作者A0资讯所有,未经许可,不得转载

上一篇 2024年 5月 31日
下一篇 2024年 5月 31日

相关推荐