多重搜尋
/multi-search
路徑允許您透過將多個搜尋查詢捆綁到單個 HTTP 請求中,對一個或多個索引執行多個搜尋查詢。多重搜尋也稱為聯合搜尋。
執行多重搜尋
在單個 API 請求中捆綁多個搜尋查詢。使用此端點一次搜尋多個索引。
請求主體
名稱 | 類型 | 描述 |
---|---|---|
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
必須是一個物件,並且可以包含以下欄位
maxValuesPerFacet
:必須是一個整數。當指定時,表示單個刻面返回的最大值數。預設為指派給maxValuesPerFacet
索引設定 的值
當 facetsByIndex
和 mergeFacets
都存在且不為 null 時,多重搜尋回應中包含的刻面資訊會在所有查詢的索引中合併。回應會包含兩個額外欄位:facetDistribution
和 facetStats
,而不是 facetsByIndex
{
"hits": [ … ],
…
"facetFederation": {
"ATTRIBUTE": {
"VALUE": <Integer>,
"VALUE": <Integer>
}
},
"facetStats": {
"ATTRIBUTE": {
"min": <Integer>,
"max": <Integer>
}
}
}
聯合搜尋的合併演算法
聯合搜尋的合併結果會以排名分數的降序返回。為了取得最終的結果列表,Meilisearch 會依照以下程序進行比較
- 針對兩個命中結果,詳細的排名分數會以下列方式正規化
- 連續的關聯性分數(與規則
words
、typo
、attribute
、exactness
或vector
相關)會針對每個命中結果分組為單一分數 sort
和geosort
分數詳細資料保持不變
- 連續的關聯性分數(與規則
- 針對兩個命中結果,會依詞彙順序比較正規化的詳細排名分數
- 如果兩個命中結果都有關聯性分數,則較大的分數獲勝。如果平手,則移至下一步
- 如果一個結果有關聯性分數或 (geo) 排序分數,則 Meilisearch 會選擇它
- 如果兩個結果在相同的排序方向上都有排序或地理排序分數,則 Meilisearch 會根據共同排序方向比較這些值。根據共同排序方向,值必須先出現的結果獲勝。如果平手,則移至下一步
- 比較兩個命中結果的全域排名分數,以決定哪個先出現,忽略任何排序或地理排序
- 如果完全平手,則優先選擇
queries
陣列中排名最低的查詢的文檔。
不同的文檔和聯合搜尋
如果符合以下條件,則 Meilisearch 會將兩個文檔視為相同
- 它們來自相同的索引
- 且它們的主要索引鍵相同
沒有任何方法可以指定應該將多個索引中的兩個文檔視為相同。
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
端點的搜尋參數 完全相同。
limit
、offset
、hitsPerPage
和 page
這些選項與聯合搜尋不相容。
federationOptions
federationOptions
必須是一個物件。它接受以下參數
weight
:作為此特定查詢中搜尋結果排名分數的乘數。如果 <1.0
,則此查詢的命中結果較不可能出現在最終結果列表中。如果 >1.0
,則此查詢的命中結果較可能出現在最終結果列表中。必須是正浮點數。預設值為1.0
回應
對 /multi-search
查詢的回應可能會有兩種形式:聯合和非聯合。
非聯合多重搜尋請求
名稱 | 類型 | 描述 |
---|---|---|
results | 物件陣列 | 搜尋查詢的結果,順序與它們在請求中的順序相同 |
每個搜尋結果物件都由以下欄位組成
名稱 | 類型 | 描述 |
---|---|---|
indexUid | 字串 | 請求的索引的 uid |
hits | 物件陣列 | 查詢的結果 |
offset | Number | 跳過的文檔數 |
limit | Number | 要取得的文檔數 |
estimatedTotalHits | Number | 預估的總匹配數 |
totalHits | Number | 詳盡的總匹配數 |
totalPages | Number | 詳盡的搜尋結果總頁數 |
hitsPerPage | Number | 每頁的結果數 |
page | Number | 目前搜尋結果頁面 |
facetDistribution | 物件 | 指定刻面的分佈 |
facetStats | 物件 | 每個刻面的數值 min 和 max 值 |
processingTimeMs | Number | 查詢的處理時間 |
query | 字串 | 產生回應的查詢 |
聯合多重搜尋請求
聯合搜尋請求會返回一個單一物件和以下欄位
名稱 | 類型 | 描述 |
---|---|---|
indexUid | 字串 | 請求的索引的 uid |
hits | 物件陣列 | 查詢的結果 |
offset | Number | 跳過的文檔數 |
limit | Number | 要取得的文檔數 |
estimatedTotalHits | Number | 預估的總匹配數 |
totalHits | Number | 詳盡的總匹配數 |
totalPages | Number | 詳盡的搜尋結果總頁數 |
hitsPerPage | Number | 每頁的結果數 |
page | Number | 目前搜尋結果頁面 |
facetDistribution | 物件 | 指定刻面的分佈 |
facetStats | 物件 | 每個刻面的數值 min 和 max 值 |
processingTimeMs | Number | 查詢的處理時間 |
query | 字串 | 產生回應的查詢 |
hits
陣列中的每個結果都包含一個額外的 _federation
欄位,其中包含以下欄位
名稱 | 類型 | 描述 |
---|---|---|
indexUid | 字串 | 此文檔的來源索引 |
queriesPosition | Number | 請求的 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
}