diff --git a/docker/thirdparties/docker-compose/elasticsearch/scripts/es_init.sh b/docker/thirdparties/docker-compose/elasticsearch/scripts/es_init.sh index 4a734a504dd31f..7344dc09a27be4 100755 --- a/docker/thirdparties/docker-compose/elasticsearch/scripts/es_init.sh +++ b/docker/thirdparties/docker-compose/elasticsearch/scripts/es_init.sh @@ -130,6 +130,8 @@ curl "http://${ES_7_HOST}:9200/test2_20220808" -H "Content-Type:application/json curl "http://${ES_7_HOST}:9200/test2_20220809" -H "Content-Type:application/json" -X PUT -d '@/mnt/scripts/index/es7_test2.json' # create index test3_20231005 curl "http://${ES_7_HOST}:9200/test3_20231005" -H "Content-Type:application/json" -X PUT -d '@/mnt/scripts/index/es7_test3.json' +# create index test_object for object type testing (empty table) +curl "http://${ES_7_HOST}:9200/test_object" -H "Content-Type:application/json" -X PUT -d '@/mnt/scripts/index/es7_test_object.json' # put data for tese1 curl "http://${ES_7_HOST}:9200/test1/_doc/1" -H "Content-Type:application/json" -X POST -d '@/mnt/scripts/data/data1.json' curl "http://${ES_7_HOST}:9200/test1/_doc/2" -H "Content-Type:application/json" -X POST -d '@/mnt/scripts/data/data2.json' diff --git a/docker/thirdparties/docker-compose/elasticsearch/scripts/index/es7_test_object.json b/docker/thirdparties/docker-compose/elasticsearch/scripts/index/es7_test_object.json new file mode 100644 index 00000000000000..18405ea38b285c --- /dev/null +++ b/docker/thirdparties/docker-compose/elasticsearch/scripts/index/es7_test_object.json @@ -0,0 +1,16 @@ +{ + "settings": { + "number_of_shards": 1, + "number_of_replicas": 0 + }, + "mappings": { + "properties": { + "id": { + "type": "integer" + }, + "user_info": { + "type": "object" + } + } + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUtil.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUtil.java index 55fea86718aa93..a350f386ada9cb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUtil.java @@ -300,6 +300,8 @@ private static Column parseEsField(String fieldName, ObjectNode fieldValue, List case "constant_keyword": type = ScalarType.createStringType(); break; + // When ES table is empty, object fields still have explicit "type": "object" in mapping + case "object": case "nested": type = Type.JSONB; break; diff --git a/regression-test/data/external_table_p0/es/test_es_query.out b/regression-test/data/external_table_p0/es/test_es_query.out index 70cc0f4b04a5cd..61b9fd69845a5e 100644 --- a/regression-test/data/external_table_p0/es/test_es_query.out +++ b/regression-test/data/external_table_p0/es/test_es_query.out @@ -611,6 +611,12 @@ string_ignore_above_10 text_ignore_above_10 4444 4444 +-- !sql_7_39 -- +id int Yes true \N +user_info json Yes true \N + +-- !sql_7_40 -- + -- !sql_7_50 -- value1 value2 @@ -1421,6 +1427,12 @@ string_ignore_above_10 text_ignore_above_10 4444 4444 +-- !sql_7_39 -- +id int Yes true \N +user_info json Yes true \N + +-- !sql_7_40 -- + -- !sql_7_50 -- value1 value2 diff --git a/regression-test/suites/external_table_p0/es/test_es_query.groovy b/regression-test/suites/external_table_p0/es/test_es_query.groovy index 22789b9ebe1997..4994018a4c0ee3 100644 --- a/regression-test/suites/external_table_p0/es/test_es_query.groovy +++ b/regression-test/suites/external_table_p0/es/test_es_query.groovy @@ -344,6 +344,8 @@ suite("test_es_query", "p0,external,es,external_docker,external_docker_es") { order_qt_sql_7_36 """select test1, test2 from test1 where test2 like 'text%';""" order_qt_sql_7_37 """select test9 from test1;""" order_qt_sql_7_38 """select test9 from test2;""" + order_qt_sql_7_39 """desc test_object;""" + order_qt_sql_7_40 """select * from test_object;""" List> tables7N = sql """show tables""" boolean notContainHide7 = true