Go to Magento\Elasticsearch6\Model\Client\Elasticsearch
Find function addFieldsMapping
approx line number 241
Add new element to $params
array
'include_type_name' => true,
This will resolve your error
$params = [
'index' => $index,
'type' => $entityType,
'include_type_name' => true,
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.
Best Answer
If you are using Magento 2.3.0 you have to use elasticsearch 5.x. Refer to offical doc.
Composer of Magento 2.3.0
If you want to use elasticsearch 6.x you need to upgrade your magento to v2.3.1.
Composer of Magento 2.3.1