多重搜尋

    /multi-search 路徑允許您透過將多個搜尋查詢捆綁到單個 HTTP 請求中,對一個或多個索引執行多個搜尋查詢。多重搜尋也稱為聯合搜尋。

    在單個 API 請求中捆綁多個搜尋查詢。使用此端點一次搜尋多個索引。

    POST/multi-search

    請求主體

    名稱類型描述
    federation物件如果存在且不為 null,則會返回一個合併所有指定查詢的搜尋結果的單一列表
    queries物件陣列包含要執行的搜尋查詢列表。需要 indexUid 搜尋參數,所有其他參數都是選用的
    警告

    如果 Meilisearch 在處理多重搜尋請求中的任何查詢時遇到錯誤,它會立即停止處理請求並返回錯誤訊息。返回的訊息將僅針對遇到的第一個錯誤。

    federation

    使用 federation 以接收一個包含所有指定查詢的搜尋結果的單一列表,並依照排名分數的降序排列。這稱為聯合搜尋。

    federation 可以選擇包含以下參數

    參數類型預設值描述
    offset整數0要跳過的文檔數
    limit整數20返回的最大文檔數
    facetsByIndex陣列的物件null顯示指定索引的刻面資訊
    mergeFacets物件null顯示指定索引的刻面資訊

    如果缺少 federation 或為 null,則 Meilisearch 會返回一個包含多個搜尋結果物件的列表,列表中的每個項目對應於請求中的一個搜尋查詢。

    facetsByIndex

    facetsByIndex 必須是一個物件。其鍵必須對應於您的 Meilisearch 專案中的索引。每個鍵必須與該索引的可篩選屬性列表中的屬性陣列相關聯

    "facetsByIndex": {
      "INDEX_A": ["ATTRIBUTE_X", "ATTRIBUTE_Y"],
      "INDEX_B": ["ATTRIBUTE_Z"]
    }
    

    當您指定 facetsByIndex 時,多重搜尋回應會包含一個額外的 facetsByIndex 欄位。回應的 facetsByIndex 是一個物件,每個查詢的索引都有一個欄位

    {
      "hits" [],"facetsByIndex": {
        "INDEX_A": {
          "distribution": {
            "ATTRIBUTE_X": {
              "KEY": <Integer>,
              "KEY": <Integer>,},
            "ATTRIBUTE_Y": {
              "KEY": <Integer>,}
          },
          "stats": {
            "KEY": {
              "min": <Integer>,
              "max": <Integer>
            }
          }
        },
        "INDEX_B": {}
      }
    }
    
    mergeFacets

    mergeFacets 必須是一個物件,並且可以包含以下欄位

    facetsByIndexmergeFacets 都存在且不為 null 時,多重搜尋回應中包含的刻面資訊會在所有查詢的索引中合併。回應會包含兩個額外欄位:facetDistributionfacetStats,而不是 facetsByIndex

    {
      "hits": [],"facetFederation": {
        "ATTRIBUTE": {
          "VALUE": <Integer>,
          "VALUE": <Integer>
        }
      },
      "facetStats": {
        "ATTRIBUTE": {
          "min": <Integer>,
          "max": <Integer>
        }
      }
    }
    
    聯合搜尋的合併演算法

    聯合搜尋的合併結果會以排名分數的降序返回。為了取得最終的結果列表,Meilisearch 會依照以下程序進行比較

    1. 針對兩個命中結果,詳細的排名分數會以下列方式正規化
      1. 連續的關聯性分數(與規則 wordstypoattributeexactnessvector 相關)會針對每個命中結果分組為單一分數
      2. sortgeosort 分數詳細資料保持不變
    2. 針對兩個命中結果,會依詞彙順序比較正規化的詳細排名分數
      1. 如果兩個命中結果都有關聯性分數,則較大的分數獲勝。如果平手,則移至下一步
      2. 如果一個結果有關聯性分數或 (geo) 排序分數,則 Meilisearch 會選擇它
      3. 如果兩個結果在相同的排序方向上都有排序或地理排序分數,則 Meilisearch 會根據共同排序方向比較這些值。根據共同排序方向,值必須先出現的結果獲勝。如果平手,則移至下一步
      4. 比較兩個命中結果的全域排名分數,以決定哪個先出現,忽略任何排序或地理排序
      5. 如果完全平手,則優先選擇 queries 陣列中排名最低的查詢的文檔。
    不同的文檔和聯合搜尋

    如果符合以下條件,則 Meilisearch 會將兩個文檔視為相同

    1. 它們來自相同的索引
    2. 且它們的主要索引鍵相同

    沒有任何方法可以指定應該將多個索引中的兩個文檔視為相同。

    queries

    queries 必須是一個物件陣列。每個物件都可以包含以下搜尋參數

    搜尋參數類型預設值描述
    federationOptions物件null設定特定查詢的聯合設定
    indexUid字串不適用請求的索引的 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 'https://127.0.0.1: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 'https://127.0.0.1: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
    }