From fde7d7dde2ffd57f9e18cbc7328073ad8b34e95d Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Fri, 28 Feb 2025 12:45:03 +0100 Subject: [PATCH] Elastic: Properly display sparse result rows Result records in Elasticsearch do not always have all columns that are defined in an index. This often happens when multiple document types are stored in the same index. The first row has columns ["_id", "html", "url"], while the second misses the "html" column: ["_id", "url"]. Adminer expects that all result rows include all columns. This leads to the problem that the "url" value in the 2nd example row was rendered in the "html" column. This patch fixes this problem by fetching the actual column list first when all fields are to be shown, and using that field list as base for all rows. --- plugins/drivers/elastic.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/drivers/elastic.php b/plugins/drivers/elastic.php index 29d46651..a11dd64f 100644 --- a/plugins/drivers/elastic.php +++ b/plugins/drivers/elastic.php @@ -205,6 +205,9 @@ if (isset($_GET["elastic"])) { if (empty($search)) { return false; } + if ($select == array("*")) { + $tableFields = array_keys(fields($table)); + } $return = array(); foreach ($search["hits"]["hits"] as $hit) { @@ -219,7 +222,9 @@ if (isset($_GET["elastic"])) { $fields[$key] = $key == "_id" ? $hit["_id"] : $hit["_source"][$key]; } } else { - $fields = $hit["_source"]; + foreach ($tableFields as $key) { + $fields[$key] = $key == "_id" ? $hit["_id"] : $hit["_source"][$key]; + } } foreach ($fields as $key => $val) { $row[$key] = (is_array($val) ? json_encode($val) : $val); -- 2.39.5