Magento 2.3.3 main.ERROR: {“error”:{“root_cause”:[{“type”:“query_shard_exception”,“reason”:" No mapping found for ['attribute'] in order to sort on
-
20-03-2021 - |
题
I have just upgraded to Magento ver. 2.3.3 (from 2.2.8) with Elasticsearch and I am having an issue with my custom module regarding the sort by options.
Elasticsearch information:
{
"name" : "yWDvGWs",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "0L1pnmTiQBaWL21J5p5iPw",
"version" : {
"number" : "5.6.12",
"build_hash" : "cfe3d9f",
"build_date" : "2018-09-10T20:12:43.732Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
My module contains two plugins as following (di.xml):
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
<plugin name="custom_custom_block_toolbar" type="Vendor\Module\Plugin\Catalog\Block\Toolbar" />
</type>
<type name="Magento\Catalog\Model\Config">
<plugin name="custom_catalog_model_config" type="Vendor\Module\Plugin\Catalog\Model\Config" />
</type>
</config>
Here is the plugin for the Magento\Catalog\Block\Product\ProductList\Toolbar
(Toolbar.php):
<?php
namespace Vendor\Module\Plugin\Catalog\Block;
class Toolbar
{
public function aroundSetCollection(
\Magento\Catalog\Block\Product\ProductList\Toolbar $subject,
\Closure $proceed,
$collection
) {
$currentOrder = $subject->getCurrentOrder();
$result = $proceed($collection);
if ($currentOrder) {
if ($currentOrder == 'price_high_to_low') {
$subject->getCollection()->setOrder('price', 'desc');
} elseif ($currentOrder == 'price') {
$subject->getCollection()->setOrder('price', 'asc');
} elseif ($currentOrder == 'name') {
$subject->getCollection()->setOrder('name', 'asc');
} elseif ($currentOrder == 'name_z_a') {
$subject->getCollection()->setOrder('name', 'desc');
} elseif ($currentOrder == 'news_to_date'){
$subject->getCollection()->setOrder('news_to_date', 'desc');
} elseif ($currentOrder == 'newest_news_to_date'){
$subject->getCollection()->setOrder('news_to_date', 'asc');
} elseif ($currentOrder == 'popularity_by_rating'){
$subject->getCollection()->setOrder('popularity_by_rating', 'desc');
}
}
return $result;
}
}
And here is my plugin for Magento\Catalog\Model\Config
(Config.php):
<?php
namespace Vendor\Module\Plugin\Catalog\Model;
class Config
{
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['price'] = __('Price : Low - High');
$options['price_high_to_low'] = __('Price : High - Low');
$options['news_to_date'] = __('Date : Newest');
$options['newest_news_to_date'] = __('Date : Oldest');
$options['name'] = __('Name : A-Z');
$options['name_z_a'] = __('Name : Z-A');
$options['position'] = __('Our Favourites');
asort($options);
return $options;
}
}
The module was working as expected on my Magento ver. 2.2.8 store. After the upgrade, I get this error message on the frontend when trying to filter by the newly added sort by's:
Sorry, search engine is currently unavailable
I also see this error in the debug.log log file:
[2019-11-21 11:39:25] main.ERROR: {"error":{"root_cause":[{"type":"query_shard_exception","reason":"No mapping found for [price_high_to_low] in order to sort on","index_uuid":"NJTUipntQBKzkKSBSWTvxg","index":"magento22_product_1_v113"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"magento22_product_1_v113","node":"yWDvGWsDR2qYSsNUNvZsKg","reason":{"type":"query_shard_exception","reason":"No mapping found for [price_high_to_low] in order to sort on","index_uuid":"NJTUipntQBKzkKSBSWTvxg","index":"magento22_product_1_v113"}}]},"status":400} [] []
Any help towards fix will be appreciated.
UPDATE:
Based on the answer, I have upgraded the Elasticsearch to the latest version. This hasn't fixed the problem. This issue still persists. Current Elasticsearch information:
{
"name" : "6WK1xO7",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "5vL1wHvHQt29HWV-xlQ2XQ",
"version" : {
"number" : "6.8.4",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "bca0c8d",
"build_date" : "2019-10-16T06:19:49.319352Z",
"build_snapshot" : false,
"lucene_version" : "7.7.2",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
没有正确的解决方案
其他提示
I suggest first updating your Elasticsearch, then seeing if this resolves it as Magento claims to support 6.x, and does not recommend versions 2.x and 5.x (albeit providing support).
[...]
Magento Commerce version 2.3.x supports the following Elasticsearch versions:
- Magento 2.3 uses Elasticsearch PHP client version 6.1.
[...]
Please see: Technologies Magento can use
Custom Sort with ElasticSearch in Magento issue can be fixed by following these simple steps:
- Navigate to Stores->Attributes->Product in Admin.
- Add New Attribute.
- In Properties->Attribute Properties:
- Add Default Label (Eg: Price: Low to High)
- Select the Catalog Input Type for Store Owner (Eg: Price) (In other cases Text Field is enough).
- In Properties->Advanced Attribute Properties:
- Add Attribute Code (Eg: price_asc).
- In Storefront Properties->Storefront Properties:
- Select User for Sorting in Product Listing to Yes
Once done with the above steps run the following commands,
bin/magento indexer:reindex catalogsearch_fulltext
bin/magento indexer:reindex