This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 5be8f9432e [fix](DOE) Support ES index which contains
dynamic_templates (#14762)
5be8f9432e is described below
commit 5be8f9432ec0738d4b62685c01deacd547673186
Author: qiye <[email protected]>
AuthorDate: Mon Dec 5 08:33:51 2022 +0800
[fix](DOE) Support ES index which contains dynamic_templates (#14762)
Support ES index with dynamic_templates. And do not support index mapping
without explicit mapping.
---
.../doris/external/elasticsearch/EsUtil.java | 23 ++++++++-
.../doris/external/elasticsearch/EsUtilTest.java | 52 +++++++++++++++++++
.../data/es/es6_dynamic_templates_mapping.json | 60 ++++++++++++++++++++++
.../es/es6_only_dynamic_templates_mapping.json | 40 +++++++++++++++
.../data/es/es7_dynamic_templates_mapping.json | 58 +++++++++++++++++++++
.../es/es7_only_dynamic_templates_mapping.json | 38 ++++++++++++++
.../data/es/es8_dynamic_templates_mapping.json | 58 +++++++++++++++++++++
.../es/es8_only_dynamic_templates_mapping.json | 38 ++++++++++++++
8 files changed, 365 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
index 1d50bbca42..7cf22cfda3 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
@@ -163,22 +163,41 @@ public class EsUtil {
// 2. Multi-catalog auto infer
// 3. Equal 6.8.x and before user not passed
if (mappingType == null) {
+ // remove dynamic templates, for ES 7.x and 8.x
+ checkDynamicTemplates(mappings);
String firstType = (String) mappings.keySet().iterator().next();
if (!"properties".equals(firstType)) {
// If type is not passed in takes the first type.
- return (JSONObject) mappings.get(firstType);
+ JSONObject firstData = (JSONObject) mappings.get(firstType);
+ // check for ES 6.x and before
+ checkDynamicTemplates(firstData);
+ return firstData;
}
// Equal 7.x and after
return mappings;
} else {
if (mappings.containsKey(mappingType)) {
- return (JSONObject) mappings.get(mappingType);
+ JSONObject jsonData = (JSONObject) mappings.get(mappingType);
+ // check for ES 6.x and before
+ checkDynamicTemplates(jsonData);
+ return jsonData;
}
// Compatible type error
return getRootSchema(mappings, null);
}
}
+ /**
+ * Remove `dynamic_templates` and check explicit mapping
+ * @param mappings
+ */
+ private static void checkDynamicTemplates(JSONObject mappings) {
+ mappings.remove("dynamic_templates");
+ if (mappings.isEmpty()) {
+ throw new DorisEsException("Do not support index without explicit
mapping.");
+ }
+ }
+
/**
* Get mapping properties JSONObject.
**/
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
index 654cd08697..7783b4d437 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
@@ -41,8 +41,10 @@ import mockit.Injectable;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
+import org.junit.rules.ExpectedException;
import java.io.IOException;
import java.net.URISyntaxException;
@@ -68,6 +70,9 @@ public class EsUtilTest extends EsTestCase {
+ " \"created\": \"5050099\"\n" + "
}\n" + " }\n"
+ " }}";
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
/**
* Init columns.
**/
@@ -298,17 +303,36 @@ public class EsUtilTest extends EsTestCase {
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliases.toJSONString());
+
JSONObject testAliasesNoType = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es6_aliases_mapping.json"), null);
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliasesNoType.toJSONString());
+
JSONObject testIndex = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es6_index_mapping.json"),
"doc");
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testIndex.toJSONString());
+
+ JSONObject testDynamicTemplates = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es6_dynamic_templates_mapping.json"),
+ "doc");
+
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+ +
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+ +
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
+ testDynamicTemplates.toJSONString());
+
+ expectedEx.expect(DorisEsException.class);
+ expectedEx.expectMessage("Do not support index without explicit
mapping.");
+ EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es6_only_dynamic_templates_mapping.json"),
+ "doc");
+
+ expectedEx.expect(DorisEsException.class);
+ expectedEx.expectMessage("Do not support index without explicit
mapping.");
+ EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es6_only_dynamic_templates_mapping.json"),
+ null);
}
@Test
@@ -318,17 +342,31 @@ public class EsUtilTest extends EsTestCase {
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliases.toJSONString());
+
JSONObject testAliasesErrorType = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es7_aliases_mapping.json"), "doc");
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliasesErrorType.toJSONString());
+
JSONObject testIndex = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es7_index_mapping.json"),
"doc");
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testIndex.toJSONString());
+
+ JSONObject testDynamicTemplates = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es7_dynamic_templates_mapping.json"),
+ null);
+
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+ +
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+ +
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
+ testDynamicTemplates.toJSONString());
+
+ expectedEx.expect(DorisEsException.class);
+ expectedEx.expectMessage("Do not support index without explicit
mapping.");
+ EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es7_only_dynamic_templates_mapping.json"),
+ null);
}
@Test
@@ -338,17 +376,31 @@ public class EsUtilTest extends EsTestCase {
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliases.toJSONString());
+
JSONObject testAliasesErrorType = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es8_aliases_mapping.json"), "doc");
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testAliasesErrorType.toJSONString());
+
JSONObject testIndex = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es8_index_mapping.json"),
"doc");
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
testIndex.toJSONString());
+
+ JSONObject testDynamicTemplates = EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es8_dynamic_templates_mapping.json"),
+ "doc");
+
Assertions.assertEquals("{\"test4\":{\"type\":\"date\"},\"test2\":{\"type\":\"text\","
+ +
"\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
+ +
"\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}",
+ testDynamicTemplates.toJSONString());
+
+ expectedEx.expect(DorisEsException.class);
+ expectedEx.expectMessage("Do not support index without explicit
mapping.");
+ EsUtil.getMappingProps("test",
loadJsonFromFile("data/es/es8_only_dynamic_templates_mapping.json"),
+ "doc");
}
}
diff --git
a/fe/fe-core/src/test/resources/data/es/es6_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es6_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..ccde761b6b
--- /dev/null
+++ b/fe/fe-core/src/test/resources/data/es/es6_dynamic_templates_mapping.json
@@ -0,0 +1,60 @@
+{
+ "test_202207": {
+ "mappings": {
+ "doc": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ],
+ "properties": {
+ "test1": {
+ "type": "keyword"
+ },
+ "test2": {
+ "type": "text",
+ "fields": {
+ "keyword": {
+ "type": "keyword",
+ "ignore_above": 256
+ }
+ }
+ },
+ "test3": {
+ "type": "double"
+ },
+ "test4": {
+ "type": "date"
+ }
+ }
+ }
+ }
+ }
+}
diff --git
a/fe/fe-core/src/test/resources/data/es/es6_only_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es6_only_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..6bc825320c
--- /dev/null
+++
b/fe/fe-core/src/test/resources/data/es/es6_only_dynamic_templates_mapping.json
@@ -0,0 +1,40 @@
+{
+ "test_202207": {
+ "mappings": {
+ "doc": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+}
diff --git
a/fe/fe-core/src/test/resources/data/es/es7_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es7_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..5a5598a688
--- /dev/null
+++ b/fe/fe-core/src/test/resources/data/es/es7_dynamic_templates_mapping.json
@@ -0,0 +1,58 @@
+{
+ "test_202207": {
+ "mappings": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ],
+ "properties": {
+ "test1": {
+ "type": "keyword"
+ },
+ "test2": {
+ "type": "text",
+ "fields": {
+ "keyword": {
+ "type": "keyword",
+ "ignore_above": 256
+ }
+ }
+ },
+ "test3": {
+ "type": "double"
+ },
+ "test4": {
+ "type": "date"
+ }
+ }
+ }
+ }
+}
diff --git
a/fe/fe-core/src/test/resources/data/es/es7_only_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es7_only_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..091c4b0def
--- /dev/null
+++
b/fe/fe-core/src/test/resources/data/es/es7_only_dynamic_templates_mapping.json
@@ -0,0 +1,38 @@
+{
+ "test_202207": {
+ "mappings": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git
a/fe/fe-core/src/test/resources/data/es/es8_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es8_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..5a5598a688
--- /dev/null
+++ b/fe/fe-core/src/test/resources/data/es/es8_dynamic_templates_mapping.json
@@ -0,0 +1,58 @@
+{
+ "test_202207": {
+ "mappings": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ],
+ "properties": {
+ "test1": {
+ "type": "keyword"
+ },
+ "test2": {
+ "type": "text",
+ "fields": {
+ "keyword": {
+ "type": "keyword",
+ "ignore_above": 256
+ }
+ }
+ },
+ "test3": {
+ "type": "double"
+ },
+ "test4": {
+ "type": "date"
+ }
+ }
+ }
+ }
+}
diff --git
a/fe/fe-core/src/test/resources/data/es/es8_only_dynamic_templates_mapping.json
b/fe/fe-core/src/test/resources/data/es/es8_only_dynamic_templates_mapping.json
new file mode 100644
index 0000000000..091c4b0def
--- /dev/null
+++
b/fe/fe-core/src/test/resources/data/es/es8_only_dynamic_templates_mapping.json
@@ -0,0 +1,38 @@
+{
+ "test_202207": {
+ "mappings": {
+ "dynamic_templates" : [
+ {
+ "message_full" : {
+ "match" : "message_full",
+ "mapping" : {
+ "fields" : {
+ "keyword" : {
+ "ignore_above" : 2048,
+ "type" : "keyword"
+ }
+ },
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "message" : {
+ "match" : "message",
+ "mapping" : {
+ "type" : "text"
+ }
+ }
+ },
+ {
+ "strings" : {
+ "match_mapping_type" : "string",
+ "mapping" : {
+ "type" : "keyword"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]