Got across this several times and we came across this https://support.magento.com/hc/en-us/articles/360027356612-Elasticsearch-5-is-configured-but-search-page-does-not-load-with-Fielddata-is-disabled-error which not only identifies the problem but also gives a fix which works with several Magento versions. I tried 2.3.5 and 2.4.2.
By default, only certain types of product attributes can be used in Layered Navigation. They are Yes/No, Dropdown, Multipleselect, and Price. That is why in Magento Admin, you cannot set an attribute of any other type as Use in Layered Navigation = Filterable or Use in Search Results Layered Navigation = Yes. But there is a technical possibility to get around this limitation by directly changing the is_filterable and is_filterable_in_search values in the database. If this happens, and any other attribute type, like Date, Text, etc., is set to be used in Layered Navigation, Elasticsearch 5 (my edit: and others like ElasticSearch 6 and 7) throws an exception.
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.
Step 1. Identify the product attributes which generate the issue using an SQL tool like phpmyadmin
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');
To fix the issue, you need to set is_filterable (that is, used in Layered Navigation) and filterable_in_search (that is, used in search results Layered Navigation) to "0" (not used).
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');
then reindex all
bin/magento indexer:reindex
The fix says to reindex only catalogsearch_fulltext
but this won't work if you have custom search modules since they use different indexes.
I don't know this is the correct way to do this or not. I was waiting for someone to give a better answer but not getting one. So I am using this for now.
# Get the attribute_id of 'created_at'
select attribute_id from eav_attribute where attribute_code = 'created_at' and entity_type_id=4;
# Set frontend_label
update eav_attribute set frontend_label = 'Created At' where attribute_id=112;
# Set used_for_sort_by
update catalog_eav_attribute set used_for_sort_by = 1 where attribute_id=112;
Best Answer
Go to
Magento\Elasticsearch6\Model\Client\Elasticsearch
Find function
addFieldsMapping
approx line number 241Add new element to
$params
arrayThis will resolve your error