This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new e50a46b723 Change the string field in Elasticsearch storage from 
**keyword** type to *text* if they appoint size more than `32766` (#11731)
e50a46b723 is described below

commit e50a46b7235758f82c7241c74c2395807543a0c7
Author: mrproliu <[email protected]>
AuthorDate: Sun Jan 7 18:13:54 2024 +0800

    Change the string field in Elasticsearch storage from **keyword** type to 
*text* if they appoint size more than `32766` (#11731)
---
 docs/en/changes/changes.md                         |  2 ++
 .../elasticsearch/base/ColumnTypeEsMapping.java    |  6 ++++--
 .../elasticsearch/base/StorageEsInstaller.java     |  6 ++++--
 .../ElasticSearchColumnTypeMappingTestCase.java    | 24 +++++++++++++---------
 4 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index a34901c978..5e37c09535 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -13,6 +13,8 @@
 * Set up the length of source and dest IDs in relation entities of service, 
instance, endpoint, and process to 250(was
   200).
 * Support build Service/Instance Hierarchy and query.
+* Change the string field in Elasticsearch storage from **keyword** type to 
**text** type if it set more than `32766` length.
+* [Break Change] Change the configuration field of `ui_template` and `ui_menu` 
in Elasticsearch storage from **keyword** type to **text**.
 
 #### UI
 
diff --git 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
index e0d2af9540..914154ea40 100644
--- 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
+++ 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
@@ -28,13 +28,15 @@ import 
org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje
 
 public class ColumnTypeEsMapping {
 
-    public String transform(Class<?> type, Type genericType, final 
ElasticSearchExtension elasticSearchExtension) {
+    public String transform(Class<?> type, Type genericType, int length, 
boolean storageOnly, final ElasticSearchExtension elasticSearchExtension) {
         if (Integer.class.equals(type) || int.class.equals(type) || 
Layer.class.equals(type)) {
             return "integer";
         } else if (Long.class.equals(type) || long.class.equals(type)) {
             return "long";
         } else if (Double.class.equals(type) || double.class.equals(type)) {
             return "double";
+        } else if (String.class.equals(type) && storageOnly && length > 32766) 
{   // 32766 is the max length of a keywords field in ES
+            return "text";
         } else if (String.class.equals(type) || 
elasticSearchExtension.isKeyword()) {
             return "keyword";
         } else if (StorageDataComplexObject.class.isAssignableFrom(type)) {
@@ -45,7 +47,7 @@ public class ColumnTypeEsMapping {
             return "text";
         } else if (List.class.isAssignableFrom(type)) {
             final Type elementType = ((ParameterizedType) 
genericType).getActualTypeArguments()[0];
-            return transform((Class<?>) elementType, elementType, 
elasticSearchExtension);
+            return transform((Class<?>) elementType, elementType, length, 
storageOnly, elasticSearchExtension);
         } else {
             throw new IllegalArgumentException("Unsupported data type: " + 
type.getName());
         }
diff --git 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
index 39cc09e82e..050941886a 100644
--- 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
+++ 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
@@ -255,7 +255,7 @@ public class StorageEsInstaller extends ModelInstaller {
         if (!CollectionUtils.isEmpty(specificSettings)) {
             indexSettings.putAll(specificSettings);
         }
-        
+
         return setting;
     }
 
@@ -308,7 +308,9 @@ public class StorageEsInstaller extends ModelInstaller {
         Map<String, Object> properties = new HashMap<>();
         Mappings.Source source = new Mappings.Source();
         for (ModelColumn columnDefine : model.getColumns()) {
-            final String type = 
columnTypeEsMapping.transform(columnDefine.getType(), 
columnDefine.getGenericType(), columnDefine.getElasticSearchExtension());
+            final String type = 
columnTypeEsMapping.transform(columnDefine.getType(), 
columnDefine.getGenericType(),
+                columnDefine.getLength(), columnDefine.isStorageOnly(),
+                columnDefine.getElasticSearchExtension());
             String columnName = columnDefine.getColumnName().getName();
             String legacyName = 
columnDefine.getElasticSearchExtension().getLegacyColumnName();
             if (config.isLogicSharding() && 
!Strings.isNullOrEmpty(legacyName)) {
diff --git 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ElasticSearchColumnTypeMappingTestCase.java
 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ElasticSearchColumnTypeMappingTestCase.java
index 550683b231..26ba769b20 100644
--- 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ElasticSearchColumnTypeMappingTestCase.java
+++ 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ElasticSearchColumnTypeMappingTestCase.java
@@ -32,26 +32,30 @@ public class ElasticSearchColumnTypeMappingTestCase {
     @Test
     public void test() throws NoSuchFieldException {
         ColumnTypeEsMapping mapping = new ColumnTypeEsMapping();
+        int defaultLength = 200;
+        boolean defaultStorageOnly = false;
 
-        Assertions.assertEquals("integer", mapping.transform(int.class, 
int.class, null));
-        Assertions.assertEquals("integer", mapping.transform(Integer.class, 
Integer.class, null));
+        Assertions.assertEquals("integer", mapping.transform(int.class, 
int.class, defaultLength, defaultStorageOnly, null));
+        Assertions.assertEquals("integer", mapping.transform(Integer.class, 
Integer.class, defaultLength, defaultStorageOnly, null));
 
-        Assertions.assertEquals("long", mapping.transform(long.class, 
long.class, null));
-        Assertions.assertEquals("long", mapping.transform(Long.class, 
Long.class, null));
+        Assertions.assertEquals("long", mapping.transform(long.class, 
long.class, defaultLength, defaultStorageOnly, null));
+        Assertions.assertEquals("long", mapping.transform(Long.class, 
Long.class, defaultLength, defaultStorageOnly, null));
 
-        Assertions.assertEquals("double", mapping.transform(double.class, 
double.class, null));
-        Assertions.assertEquals("double", mapping.transform(Double.class, 
Double.class, null));
+        Assertions.assertEquals("double", mapping.transform(double.class, 
double.class, defaultLength, defaultStorageOnly, null));
+        Assertions.assertEquals("double", mapping.transform(Double.class, 
Double.class, defaultLength, defaultStorageOnly, null));
 
-        Assertions.assertEquals("keyword", mapping.transform(String.class, 
String.class, null));
+        Assertions.assertEquals("keyword", mapping.transform(String.class, 
String.class, defaultLength, defaultStorageOnly, null));
+        Assertions.assertEquals("keyword", mapping.transform(String.class, 
String.class, 100_000, defaultStorageOnly, null));
+        Assertions.assertEquals("text", mapping.transform(String.class, 
String.class, 100_000, true, null));
 
         final Type listFieldType = 
this.getClass().getField("a").getGenericType();
-        Assertions.assertEquals("keyword", mapping.transform(List.class, 
listFieldType,
+        Assertions.assertEquals("keyword", mapping.transform(List.class, 
listFieldType, defaultLength, defaultStorageOnly,
                                                          new 
ElasticSearchExtension(null, null, false, false)
         ));
 
-        Assertions.assertEquals("keyword", mapping.transform(IntList.class, 
int.class,
+        Assertions.assertEquals("keyword", mapping.transform(IntList.class, 
int.class, defaultLength, defaultStorageOnly,
                                                          new 
ElasticSearchExtension(null, null, true, false)));
-        Assertions.assertEquals("text", mapping.transform(IntList.class, 
int.class,
+        Assertions.assertEquals("text", mapping.transform(IntList.class, 
int.class, defaultLength, defaultStorageOnly,
                                                          new 
ElasticSearchExtension(null, null, false, false)));
     }
 }

Reply via email to