多重搜索

    /multi-search 路由允许您通过将多个搜索请求捆绑到一个 HTTP 请求中,对一个或多个索引执行多个搜索查询。多重搜索也称为联合搜索。

    将多个搜索请求捆绑到单个 API 请求中。使用此端点可以一次搜索多个索引。

    POST/multi-search

    主体

    名称类型说明
    federation对象如果存在且不为 null,则返回一个列表,将所有指定查询中的所有搜索结果合并到一起
    queries对象数组包含要执行的搜索查询列表。 indexUid 搜索参数是必需的,其他所有参数都是可选的
    警告

    如果 Meilisearch 在处理多重搜索请求中的任何查询时遇到错误,它会立即停止处理请求并返回一条错误消息。返回的消息只将解决遇到的第一个错误。

    federation

    使用federation 来接收一个列表,其中包含按递减排名得分顺序组合来自所有指定查询的所有搜索结果。这称为联合搜索。

    federation 可选包含以下参数

    参数类型默认值说明
    offset整数0要跳过的文档数
    limit整数20返回的最大文档数

    如果 federation 缺失或为 null,Meilisearch 会返回一个多个搜索结果对象的列表,列表中的每一项都对应于请求中的搜索查询。

    联合搜索的合并算法

    联合搜索的合并结果按递减排名得分返回。为获取最终结果列表,Meilisearch 会使用以下过程进行比较

    1. 两种匹配的详细排名得分的归一化方式如下
      1. 连续相关性得分(与规则 wordstypoattributeexactnessvector 相关)在每个匹配中归为一个单一分数
      2. sortgeosort 得分详情保持不变
    2. 两种匹配的归一化详细排名得分按字母顺序比较
      1. 如果两种匹配都有一个相关性得分,则较高得分胜出。如果是平局,则继续下一步
      2. 如果一个结果有相关性得分或一个 (地理) 排序得分,Meilisearch 会选择该结果
      3. 如果两个结果在同一个排序方向上有排序或地理排序得分,Meilisearch 将根据共同的排序方向比较值。根据共同的排序方向,必须先出现的值胜出。如果是平局,则继续下一步
      4. 将两个匹配的全局排名得分进行比较,以确定哪一个先出现,忽略任何排序或地理排序
      5. 如果完全平局,则优先选择queries 数组中排名最低的查询中的文档。
    不同文档和联合搜索

    如果满足以下条件,Meilisearch 将认为两个文档相同

    1. 它们来自同一个索引
    2. 并且它们的主键相同

    没有办法指定在多个索引中应将两个文档视为相同。

    queries

    queries 必须是一个对象数组。每个对象可能包含以下搜索参数

    搜索参数类型默认值说明
    federationOptions对象null为一个特定查询配置联合设置
    indexUid字符串N/A请求索引的uid
    q字符串""查询字符串
    offset整数0要跳过的文档数
    limit整数20返回的最大文档数
    hitsPerPage整数1一页返回的最大文档数
    page整数1请求特定页面结果
    filter字符串null按照一个属性值筛选查询
    facets字符串数组null按每个方面显示匹配次数
    attributesToRetrieve字符串数组["*"]要显示在返回的文档中的属性
    attributesToCrop字符串数组null其值必须裁剪的属性
    cropLength整数10用单词表示的裁剪值的长度
    cropMarker字符串"…"用于标记裁剪边界的字符串
    attributesToHighlight字符串数组null突出显示属性中包含的匹配项
    highlightPreTag字符串"<em>"插入在突出显示的项目开头处的字符串
    highlightPostTag字符串"</em>"插入在突出显示的项目结尾的字符串
    showMatchesPosition布尔值false返回匹配项位置
    sort字符串数组null按属性值对搜索结果进行排序
    matchingStrategy字符串last匹配文档中查询词组时所用的策略
    showRankingScore布尔值false显示文档的全局排名得分
    attributesToSearchOn字符串数组["*"]将搜索限制到指定的属性

    除非另有说明,否则多搜索查询的搜索参数的作用与 /search 端点的搜索参数 完全相同。

    limitoffsethitsPerPagepage

    这些选项与联合搜索不兼容。

    federationOptions

    federationOptions 必须是一个对象。它接受以下参数

    响应

    /multi-search 查询的响应可以采用两种形式:联合搜索和非联合搜索。

    非联合搜索请求

    名称类型说明
    results对象数组搜索查询的结果,按照请求的顺序排列

    每个搜索结果对象都由以下字段组成

    名称类型说明
    indexUid字符串uid,表示请求的索引
    hits对象数组查询的结果
    offsetNumber跳过的文档数量
    limitNumber要获取的文档数量
    estimatedTotalHitsNumber估计的匹配总数
    totalHitsNumber完全匹配总数
    totalPagesNumber搜索结果页面的完全总数
    hitsPerPageNumber每页的结果数量
    pageNumber当前的搜索结果页面
    facetDistribution对象给定类型的分布
    facetStats对象每个类型中的数字 minmax
    processingTimeMsNumber查询的处理时间
    query字符串生成响应的查询

    联合搜索请求

    联合搜索请求返回一个对象和以下字段

    名称类型说明
    indexUid字符串uid,表示请求的索引
    hits对象数组查询的结果
    offsetNumber跳过的文档数量
    limitNumber要获取的文档数量
    estimatedTotalHitsNumber估计的匹配总数
    totalHitsNumber完全匹配总数
    totalPagesNumber搜索结果页面的完全总数
    hitsPerPageNumber每页的结果数量
    pageNumber当前的搜索结果页面
    facetDistribution对象给定类型的分布
    facetStats对象每个类型中的数字 minmax
    processingTimeMsNumber查询的处理时间
    query字符串生成响应的查询

    hits 数组中的每个结果都包含一个附加的 _federation 字段,其中包含以下字段

    名称类型说明
    indexUid字符串此文档的源索引
    queriesPositionNumber请求的 queries 数组中查询的数组索引号

    示例

    curl \
      -X POST 'http://localhost:7700/multi-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "queries": [
          {
            "indexUid": "movies",
            "q": "pooh",
            "limit": 5
          },
          {
            "indexUid": "movies",
            "q": "nemo",
            "limit": 5
          },
          {
            "indexUid": "movie_ratings",
            "q": "us"
          }
        ]
      }'

    响应:200 Ok

    {
      "results":[
        {
          "indexUid":"movies",
          "hits":[
            {
              "id":13682,
              "title":"Pooh's Heffalump Movie",},],
          "query":"pooh",
          "processingTimeMs":26,
          "limit":5,
          "offset":0,
          "estimatedTotalHits":22
        },
        {
          "indexUid":"movies",
          "hits":[
            {
              "id":12,
              "title":"Finding Nemo",},],
          "query":"nemo",
          "processingTimeMs":5,
          "limit":5,
          "offset":0,
          "estimatedTotalHits":11
        },
        {
          "indexUid":"movie_ratings",
          "hits":[
            {
              "id":"Us",
              "director": "Jordan Peele",}
          ],
          "query":"Us",
          "processingTimeMs":0,
          "limit":20,
          "offset":0,
          "estimatedTotalHits":1
        }
      ]
    }
    
    curl \
      -X POST 'http://localhost:7700/multi-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "federation": {},
        "queries": [
          {
            "indexUid": "movies",
            "q": "batman"
          },
          {
            "indexUid": "comics",
            "q": "batman"
          }
        ]
      }'

    响应:200 Ok

    {
      "hits": [
        {
          "id": 42,
          "title": "Batman returns",
          "overview":, 
          "_federation": {
            "indexUid": "movies",
            "queriesPosition": 0
          }
        },
        {
          "comicsId": "batman-killing-joke",
          "description":,
          "title": "Batman: the killing joke",
          "_federation": {
            "indexUid": "comics",
            "queriesPosition": 1
          }
        },],
      "processingTimeMs": 0,
      "limit": 20,
      "offset": 0,
      "estimatedTotalHits": 2,
      "semanticHitCount": 0
    }