Elasticsearch - No mapping found for [field_name] in order to sort on
1 min read

Elasticsearch - No mapping found for [field_name] in order to sort on

Sorting data in Elasticsearch, PHP / Laravel and how to fix the "no mapping found for..." error

I use Laravel Scout (sometimes PHP) with Elasticsearch making use of this great package Scout Elasticsearch driver. This allows for the possibility of sorting / ordering records directly from Elasticsearch.

Once you create your index, write a query to sort your records by a field to get the latest posts, you might be hit with the following error

Elasticsearch\Common\Exceptions\BadRequest400Exception: 

{
	"error": {
		"root_cause": [
			{
				"type": "query_shard_exception",
				"reason": "No mapping found for [field_name] in order to sort on",
				"index_uuid": "Rk1oQl22TH6vKzgTJCn57w",
				"index": "index-name"
			}
		],
		"type": "search_phase_execution_exception",
		"reason": "all shards failed",
		"phase": "query",
		"grouped": true,
		"failed_shards": [
			{
				"shard": 0,
				"index": "index-name",
				"node": "Nd1diFCdQVO9T-gx1dfazg",
				"reason": {
					"type": "query_shard_exception",
					"reason": "No mapping found for [field_name] in order to sort on",
					"index_uuid": "Rk1oQl22TH6vKzgTJCn57w",
					"index": "index-name"
				}
			}
		]
	},
	"status": 400
}

 in file /var/www/html/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php on line 675

No reason to panic, your query statement, connection with Elasticsearch is all good. The reason this error pops up is because you have no data in your mapping, therefore Elasticsearch cannot sort it. If you're coming from MySQL, this is a weird quirk to get used to.

From Elasticsearch documentation:

Ignoring Unmapped Fieldsedit
By default, the search request will fail if there is no mapping associated with a field. The unmapped_type option allows you to ignore fields that have no mapping and not sort by them. The value of this parameter is used to determine what sort values to emit.

If any of the indices that are queried doesn’t have a mapping for price then Elasticsearch will handle it as if there was a mapping of type long, with all documents in this index having no value for this field. Here is an example of how it can be used.
GET /_search
{
  "sort" : [
    { "field_name" : {"unmapped_type" : "long"} }
  ],
  "query" : {
    "term" : { "product" : "chocolate" }
  }
}

With PHP / Laravel, you can either append unmapped_type or fill up your data before the initial search. Either of the approaches should solve it.