使用多重搜索执行联合搜索

    Meilisearch 允许您使用 /multi-search 端点同时发出多个搜索请求。联合搜索是一种多重搜索,它在单个列表中返回来自多个查询的结果。

    在本教程中,您将看到如何创建包含来自 CRM 应用程序的不同类型数据的单独索引。然后,您将同时对所有这些索引执行查询,以获得单个结果列表。

    要求

    创建三个索引

    下载以下数据集:crm-chats.jsoncrm-profiles.json,和crm-tickets.json,其中包含来自虚构 CRM 应用程序的数据。

    将数据集添加到 Meilisearch 并创建三个单独的索引,profileschatstickets

    curl  -X POST 'https://127.0.0.1:7700/indexes/profiles'  -H 'Content-Type: application/json'  --data-binary @crm-profiles.json &&
    curl  -X POST 'https://127.0.0.1:7700/indexes/chats'  -H 'Content-Type: application/json'  --data-binary @crm-chats.json &&
    curl  -X POST 'https://127.0.0.1:7700/indexes/tickets'  -H 'Content-Type: application/json'  --data-binary @crm-tickets.json
    

    使用任务端点来检查索引状态。一旦 Meilisearch 成功索引了所有三个数据集,您就可以执行联合搜索了。

    当您在 CRM 应用程序中查找 Natasha Nguyen 的电子邮件地址时,您可能不知道会在聊天记录、现有客户资料还是最近的支持工单中找到它。在这种情况下,您可以使用联合搜索来搜索所有可能的来源,并收到一个结果列表。

    使用带有 federation 参数的 /multi-search 端点同时查询三个索引

    curl \
      -X POST 'https://127.0.0.1:7700/multi-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "federation": {},
        "queries": [
          {
            "indexUid": "chats",
            "q": "natasha"
          },
          {
            "indexUid": "profiles",
            "q": "natasha"
          },
          {
            "indexUid": "tickets",
            "q": "natasha"
          }
        ]
      }'
    

    Meilisearch 应该返回一个搜索结果列表

    {
      "hits": [
        {
          "id": 0,
          "client_name": "Natasha Nguyen",
          "message": "My email is [email protected]",
          "time": 1727349362,
          "_federation": {
            "indexUid": "chats",
            "queriesPosition": 0
          }
        },],
      "processingTimeMs": 0,
      "limit": 20,
      "offset": 0,
      "estimatedTotalHits": 3,
      "semanticHitCount": 0
    }
    

    提升来自特定索引的结果

    由于这是一个 CRM 应用程序,用户拥有包含其首选联系信息的个人资料。如果您想搜索 Riccardo Rotondo 的首选电子邮件,您可以提升 profiles 索引中的文档。

    使用 federation 参数的 weight 属性来提升来自特定查询的结果

    curl \
      -X POST 'https://127.0.0.1:7700/multi-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "federation": {},
        "queries": [
          {
            "indexUid": "chats",
            "q": "rotondo"
          },
          {
            "indexUid": "profiles",
            "q": "rotondo",
            "federationOptions": {
              "weight": 1.2 
            }
          },
          {
            "indexUid": "tickets",
            "q": "rotondo"
          }
        ]
      }'
    

    此请求将导致来自针对 profile 的查询的结果比来自其他查询的文档排名更高

    {
      "hits": [
      {
        "id": 1,
        "name": "Riccardo Rotondo",
        "email": "[email protected]",
          "_federation": {
            "indexUid": "profiles",
            "queriesPosition": 1
          }
        },],
      "processingTimeMs": 0,
      "limit": 20,
      "offset": 0,
      "estimatedTotalHits": 3,
      "semanticHitCount": 0
    }
    

    结论

    您创建了三个索引,然后执行了联合多索引搜索以在单个列表中接收所有结果。然后,您使用 weight 来提升最有可能包含您想要的信息的索引中的结果。