已設定Elasticsearch5,但搜尋頁面未載入「Fielddata已停用……」錯誤

本主題說明如何修正Elasticsearch5的問題,該頁面未載入搜尋頁面,且擲回類似下列的例外狀況:

{"0":"{\"error\":{\"root_cause\":[{\"type\":\"illegal_argument_exception\",\"reason\":\"Fielddata is disabled on text fields by default. Set fielddata=true on [%attribute_code%]] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.\"}].

受影響的版本

  • Adobe Commerce 2.2.x
  • Elasticsearch v.5
NOTE
Adobe Commerce 2.3.x已棄用Elasticsearch v.5

問題

先決條件:已設定Elasticsearch5。

在搜尋要求時,紀錄中會產生下列例外狀況:

{"0":"{\"error\":{\"root_cause\":[{\"type\":\"illegal_argument_exception\",\"reason\":\"Fielddata is disabled on text fields by default. Set fielddata=true on [%attribute_code%]] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.\"}].

原因

依預設,只有特定型別的產品屬性才能用於分層導覽。 它們是「是/否」、「下拉式清單」、「倍數選取」和「價格」。 這就是為什麼在Commerce Admin中,您不能將任何其他型別的屬性設定為​ 用於分層導覽 = 可篩選 ​或​ 用於搜尋結果分層導覽 = 。 但是,直接變更資料庫中的is_filterableis_filterable_in_search值,在技術上有可能繞過此限制。 如果發生此情況,而且任何其他屬性型別(例如日期、文字等)已設定為用於分層導覽,則Elasticsearch5會擲回例外狀況。

若要確保這點,您需要找出是否有任何其他屬性設定為要用於「階層導覽」,而不是「下拉式清單」、「多重選取」和「價格」。 執行以下查詢來搜尋這些屬性:

SELECT ea.attribute_code, ea.frontend_input, cea.is_filterable, cea.is_filterable_in_search FROM eav_attribute AS ea
    -> INNER JOIN catalog_eav_attribute AS cea ON ea.attribute_id = cea.`attribute_id`
    -> WHERE (is_filterable = 1 OR is_filterable_in_search = 1) AND frontend_input NOT IN ('boolean', 'multiselect', 'select', 'price');

結果將包含用於分層導覽的屬性清單,其型別不允許此作業。 請依照下節所述的步驟進行修正。

解決方案

若要修正此問題,您需要將is_filterable (即用於分層導覽)和filterable_in_search (即用於搜尋結果分層導覽)設定為「0」(未使用)。 若要這麼做,請執行下列步驟:

  1. 建立資料庫備份。

  2. 使用資料庫工具,例如phpMyAdmin,或從命令列手動存取資料庫以執行下列SQL查詢:

    code language-sql
    UPDATE catalog_eav_attribute AS cea
        INNER JOIN eav_attribute AS ea
            ON ea.attribute_id = cea.attribute_id
    SET cea.is_filterable = 0, cea.is_filterable_in_search = 0
    WHERE (cea.is_filterable = 1 OR cea.is_filterable_in_search = 1)
        AND frontend_input NOT IN ('boolean', 'multiselect', 'select', 'price');
    
  3. 使用下列命令執行「目錄搜尋」完整重新索引:

    code language-bash
    bin/magento indexer:reindex catalogsearch_fulltext
    
  4. 執行以清除快取

    code language-bash
    bin/magento cache:clean
    

或在Commerce管理員中的​ 系統 > 工具 > 快取管理 ​下。

現在您應該能夠執行目錄搜尋而不會發生問題。

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a