排序搜尋結果

    預設情況下,Meilisearch 會專注於根據關聯性對結果進行排序。您可以更改此排序行為,以便使用者在搜尋時決定他們想要優先查看哪種結果。

    這在許多情況下都很有用,例如當使用者想要查看網路商店中最便宜的產品時。

    提示

    在搜尋時排序,與占位符搜尋結合使用時,效果會特別好。

    設定 Meilisearch 以在搜尋時進行排序

    若要讓使用者在搜尋時排序結果,您必須

    1. 決定您想要用於排序的屬性
    2. 將這些屬性新增至 sortableAttributes 索引設定
    3. 更新 Meilisearch 的排名規則(選用)
    注意

    Meilisearch 會根據字元的位元組值,以詞典編纂順序對字串進行排序。例如,值為 225 的 á 將排在值為 122 的 z 之後。

    大寫字母的排序方式與小寫字母相同。它們在搜尋結果中仍會顯示為大寫。

    將屬性新增至 sortableAttributes

    Meilisearch 允許您根據文件欄位對結果進行排序。只有包含數字、字串、數值陣列和字串陣列的欄位才能用於排序。

    在您決定要允許使用者根據哪些欄位排序之後,您必須將其屬性新增至sortableAttributes 索引設定

    警告

    如果一個欄位在不同的文件中具有不同的類型值,Meilisearch 將會優先考慮數字而非字串。這表示具有數值欄位值的文件將比具有字串值的文件排名更高。

    這可能會導致排序時出現意外行為。為了獲得最佳使用者體驗,請僅根據包含相同類型值的欄位進行排序。

    範例

    假設您有一個包含以下欄位的書籍集合

    [
      {
        "id": 1,
        "title": "Solaris",
        "author": "Stanislaw Lem",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 95,
          "users": 87
        },
        "price": 5.00
      },]
    

    如果您在網路商店中使用此資料集,您可能希望允許使用者根據 authorprice 排序

    curl \
      -X PUT 'https://127.0.0.1:7700/indexes/books/settings/sortable-attributes' \
      -H 'Content-Type: application/json' \
      --data-binary '[
        "author",
        "price"
      ]'

    自訂排名規則順序(選用)

    當使用者在搜尋時對結果進行排序時,Meilisearch 的排名規則會設定為讓頂級匹配強調相關結果,而非排序順序。您可能需要根據應用程式的需求來更改此行為。

    這是 Meilisearch 排名規則的預設設定

    [
      "words",
      "typo",
      "proximity",
      "attribute",
      "sort",
      "exactness"
    ]
    

    "sort" 位於第五位。這表示它作為決勝規則:Meilisearch 會先將與搜尋字詞密切匹配的結果放在傳回的文件清單頂端,然後才會套用使用者要求的 "sort" 參數。換句話說,預設情況下,Meilisearch 提供非常相關的排序。

    "sort" 排名規則放在清單中較高的位置,將會強調詳盡的排序,而非相關的排序:您的結果將會更密切地遵循使用者選擇的排序順序,但不會那麼相關。

    推廣搜尋結果和文件釘選

    排序會平等地套用於所有文件。Meilisearch 不提供對推廣、釘選和加強特定文件的原生支援,以便讓它們比其他搜尋結果更顯著地顯示。請參閱這些 Meilisearch 部落格文章,以取得關於使用 React InstantSearch 實作推廣搜尋結果文件加強的替代方法。

    範例

    如果使用者更關心找到便宜的書籍,而不是關心找到與查詢的特定匹配,您可以將 sort 放在排名規則中較高的位置

    curl \
      -X PUT 'https://127.0.0.1:7700/indexes/books/settings/ranking-rules' \
      -H 'Content-Type: application/json' \
      --data-binary '[
        "words",
        "sort",
        "typo",
        "proximity",
        "attribute",
        "exactness"
      ]'

    在搜尋時排序結果

    在設定 sortableAttributes 之後,您可以使用sort 搜尋參數來控制搜尋結果的排序順序。

    sort 預期會取得已新增至 sortableAttributes 清單的屬性清單。

    屬性必須以 attribute:sorting_order 的形式給定。換句話說,每個屬性後面都必須加上冒號 (:) 和排序順序:遞增 (asc) 或遞減 (desc)。

    當使用 POST 路由時,sort 預期取得字串陣列

    "sort": [
      "price:asc",
      "author:desc"
    ]
    

    當使用 GET 路由時,sort 預期取得逗號分隔的字串

    sort="price:desc,author:asc"
    

    sort 值的順序很重要:屬性在搜尋參數值中的位置越高,Meilisearch 就會越優先考慮它,而不是優先考慮位置較低的屬性。在我們的範例中,如果多個文件的 price 值相同,Meilisearch 會根據其 author 來決定這些價格相似的文件之間的順序。

    範例

    假設您正在網路商店中搜尋書籍,並希望看到最便宜的科幻小說。此查詢會搜尋從最便宜到最貴排序的 "science fiction" 書籍

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "science fiction",
        "sort": ["price:asc"]
      }'

    使用我們的範例資料集,結果如下所示

    [
      {
        "id": 1,
        "title": "Solaris",
        "author": "Stanislaw Lem",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 95,
          "users": 87
        },
        "price": 5.00
      },
      {
        "id": 2,
        "title": "The Parable of the Sower",
        "author": "Octavia E. Butler",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 90,
          "users": 92
        },
        "price": 10.00
      }
    ]
    

    通常會根據作者的姓名搜尋書籍。sort 可以協助將同一作者的結果分組。此查詢只會傳回符合查詢字詞 "butler" 的書籍,並根據其作者對結果進行分組

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "butler",
        "sort": ["author:desc"]
      }'
    [
      {
        "id": 2,
        "title": "The Parable of the Sower",
        "author": "Octavia E. Butler",
        "genres": [
          "science fiction"
        ],
        "rating": {
          "critics": 90,
          "users": 92
        },
        "price": 10.00
      },
      {
        "id": 5,
        "title": "Wild Seed",
        "author": "Octavia E. Butler",
        "genres": [
          "fantasy"
        ],
        "rating": {
          "critics": 84,
          "users": 80
        },
        "price": 5.00
      },
      {
        "id": 4,
        "title": "Gender Trouble",
        "author": "Judith Butler",
        "genres": [
          "feminism",
          "philosophy"
        ],
        "rating": {
          "critics": 86,
          "users": 73
        },
        "price": 10.00
      }
    ]
    

    依巢狀欄位排序

    使用點表示法,根據文件的巢狀欄位排序結果。以下查詢會根據使用者評論分數排序傳回的文件

    curl \
      -X POST 'https://127.0.0.1:7700/indexes/books/search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "q": "science fiction",
        "sort": ["rating.users:asc"]
      }'

    排序和自訂排名規則

    排序和設定自訂排名規則之間有很多重疊之處,因為兩者都會大大影響使用者首先看到的結果。

    當您希望使用者能夠在查詢時更改傳回結果的順序時,排序最有用。例如,網路商店使用者可能希望根據他們搜尋的內容按價格對結果進行排序,並變更他們首先看到最貴的產品還是最便宜的產品。

    相反地,自訂排名規則會建立在每次搜尋中都會強制執行的預設排序規則。當您想要優先推廣某些結果高於其他所有結果時,無論使用者的喜好為何,此方法都很有用。例如,您可能希望網路商店始終優先顯示折扣產品,無論使用者搜尋什麼。

    應用程式範例

    請查看我們的演示,以取得如何實作排序的範例