瀏覽代碼

fix #2537 add elasticsearch.type

Shinsuke Sugaya 4 年之前
父節點
當前提交
0afd9776dd

+ 6 - 0
src/main/java/org/codelibs/fess/Constants.java

@@ -449,4 +449,10 @@ public class Constants extends CoreLibConstants {
     public static final String XERCES_FEATURE_PREFIX = "http://apache.org/xml/features/";
 
     public static final String LOAD_EXTERNAL_DTD_FEATURE = "nonvalidating/load-external-dtd";
+
+    public static final String FESEN_TYPE_CLOUD = "cloud";
+
+    public static final String FESEN_USERNAME = "fesen.username";
+
+    public static final String FESEN_PASSWORD = "fesen.password";
 }

+ 1 - 0
src/main/java/org/codelibs/fess/app/web/base/FessAdminAction.java

@@ -55,6 +55,7 @@ public abstract class FessAdminAction extends FessBaseAction {
                 .map(user -> user.hasRoles(fessConfig.getAuthenticationAdminRolesAsArray()) || user.hasRole(getActionRole())).orElse(false);
         runtime.registerData("editable", editable);
         runtime.registerData("editableClass", editable ? StringUtil.EMPTY : "disabled");
+        runtime.registerData("fesenType", fessConfig.getFesenType());
         final String forumLink = systemHelper.getForumLink();
         if (StringUtil.isNotBlank(forumLink)) {
             runtime.registerData("forumLink", forumLink);

+ 40 - 0
src/main/java/org/codelibs/fess/es/client/CrawlerEngineClient.java

@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012-2021 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.es.client;
+
+import org.codelibs.core.lang.StringUtil;
+import org.codelibs.fesen.client.Client;
+import org.codelibs.fesen.client.HttpClient;
+import org.codelibs.fesen.common.settings.Settings;
+import org.codelibs.fesen.common.settings.Settings.Builder;
+import org.codelibs.fess.Constants;
+import org.codelibs.fess.crawler.client.FesenClient;
+import org.codelibs.fess.mylasta.direction.FessConfig;
+import org.codelibs.fess.util.ComponentUtil;
+
+public class CrawlerEngineClient extends FesenClient {
+    protected Client createClient() {
+        final Builder builder = Settings.builder().putList("http.hosts", address);
+        final FessConfig fessConfig = ComponentUtil.getFessConfig();
+        final String username = fessConfig.getFesenUsername();
+        final String password = fessConfig.getFesenPassword();
+        if (StringUtil.isNotBlank(username) && StringUtil.isNotBlank(password)) {
+            builder.put(Constants.FESEN_USERNAME, username);
+            builder.put(Constants.FESEN_PASSWORD, password);
+        }
+        return new HttpClient(builder.build(), null);
+    }
+}

+ 72 - 30
src/main/java/org/codelibs/fess/es/client/SearchEngineClient.java

@@ -52,6 +52,7 @@ import org.codelibs.core.lang.StringUtil;
 import org.codelibs.core.lang.ThreadUtil;
 import org.codelibs.curl.CurlResponse;
 import org.codelibs.fesen.FesenException;
+import org.codelibs.fesen.FesenStatusException;
 import org.codelibs.fesen.action.ActionFuture;
 import org.codelibs.fesen.action.ActionListener;
 import org.codelibs.fesen.action.ActionRequest;
@@ -127,6 +128,7 @@ import org.codelibs.fesen.common.xcontent.XContentType;
 import org.codelibs.fesen.index.query.InnerHitBuilder;
 import org.codelibs.fesen.index.query.QueryBuilder;
 import org.codelibs.fesen.index.query.QueryBuilders;
+import org.codelibs.fesen.rest.RestStatus;
 import org.codelibs.fesen.runner.FesenRunner;
 import org.codelibs.fesen.runner.FesenRunner.Configs;
 import org.codelibs.fesen.search.SearchHit;
@@ -244,29 +246,37 @@ public class SearchEngineClient implements Client {
         String httpAddress = System.getProperty(Constants.FESS_ES_HTTP_ADDRESS);
         if (StringUtil.isBlank(httpAddress)) {
             if (runner == null) {
-                runner = new FesenRunner();
-                final Configs config = newConfigs().clusterName(clusterName).numOfNode(1).useLogger();
-                final String esDir = System.getProperty("fess.es.dir");
-                if (esDir != null) {
-                    config.basePath(esDir);
-                }
-                config.disableESLogger();
-                runner.onBuild((number, settingsBuilder) -> {
-                    final File pluginDir = new File(esDir, "plugins");
-                    if (pluginDir.isDirectory()) {
-                        settingsBuilder.put("path.plugins", pluginDir.getAbsolutePath());
-                    } else {
-                        settingsBuilder.put("path.plugins", new File(System.getProperty("user.dir"), "plugins").getAbsolutePath());
-                    }
-                    if (settings != null) {
-                        settingsBuilder.putProperties(settings, s -> s);
+                switch (fessConfig.getFesenType()) {
+                case Constants.FESEN_TYPE_CLOUD:
+                    httpAddress = org.codelibs.fess.util.ResourceUtil.getFesenHttpUrl();
+                    break;
+                default:
+                    runner = new FesenRunner();
+                    final Configs config = newConfigs().clusterName(clusterName).numOfNode(1).useLogger();
+                    final String esDir = System.getProperty("fess.es.dir");
+                    if (esDir != null) {
+                        config.basePath(esDir);
                     }
-                });
-                runner.build(config);
+                    config.disableESLogger();
+                    runner.onBuild((number, settingsBuilder) -> {
+                        final File pluginDir = new File(esDir, "plugins");
+                        if (pluginDir.isDirectory()) {
+                            settingsBuilder.put("path.plugins", pluginDir.getAbsolutePath());
+                        } else {
+                            settingsBuilder.put("path.plugins", new File(System.getProperty("user.dir"), "plugins").getAbsolutePath());
+                        }
+                        if (settings != null) {
+                            settingsBuilder.putProperties(settings, s -> s);
+                        }
+                    });
+                    runner.build(config);
+
+                    final int port = runner.node().settings().getAsInt("http.port", 9200);
+                    httpAddress = "http://localhost:" + port;
+                    logger.warn("Embedded Fesen is running. This configuration is not recommended for production use.");
+                    break;
+                }
             }
-            final int port = runner.node().settings().getAsInt("http.port", 9200);
-            httpAddress = "http://localhost:" + port;
-            logger.warn("Embedded Fesen is running. This configuration is not recommended for production use.");
         }
         client = createHttpClient(fessConfig, httpAddress);
 
@@ -332,6 +342,10 @@ public class SearchEngineClient implements Client {
 
     protected Client createHttpClient(final FessConfig fessConfig, final String host) {
         final Builder builder = Settings.builder().putList("http.hosts", host).put("processors", fessConfig.availableProcessors());
+        if (StringUtil.isNotBlank(fessConfig.getFesenUsername()) && StringUtil.isNotBlank(fessConfig.getFesenPassword())) {
+            builder.put(Constants.FESEN_USERNAME, fessConfig.getFesenUsername());
+            builder.put(Constants.FESEN_PASSWORD, fessConfig.getFesenPassword());
+        }
         return new HttpClient(builder.build(), null);
     }
 
@@ -382,12 +396,20 @@ public class SearchEngineClient implements Client {
             final boolean uploadConfig) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
 
+        final String fesenType = fessConfig.getFesenType();
         if (uploadConfig) {
-            waitForConfigSyncStatus();
-            sendConfigFiles(index);
+            switch (fesenType) {
+            case Constants.FESEN_TYPE_CLOUD:
+                // nothing
+                break;
+            default:
+                waitForConfigSyncStatus();
+                sendConfigFiles(index);
+                break;
+            }
         }
 
-        final String indexConfigFile = indexConfigPath + "/" + index + ".json";
+        final String indexConfigFile = getResourcePath(indexConfigPath, fesenType, "/" + index + ".json");
         try {
             String source = FileUtil.readUTF8(indexConfigFile);
             String dictionaryPath = System.getProperty("fess.dictionary.path", StringUtil.EMPTY);
@@ -413,6 +435,14 @@ public class SearchEngineClient implements Client {
         return false;
     }
 
+    protected String getResourcePath(final String basePath, final String type, final String path) {
+        final String target = basePath + "/_" + type + path;
+        if (ResourceUtil.getResourceNoException(target) != null) {
+            return target;
+        }
+        return basePath + path;
+    }
+
     public void addMapping(final String index, final String docType, final String indexName) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
 
@@ -421,7 +451,7 @@ public class SearchEngineClient implements Client {
         final ImmutableOpenMap<String, MappingMetadata> indexMappings = getMappingsResponse.mappings().get(indexName);
         if (indexMappings == null || !indexMappings.containsKey("properties")) {
             String source = null;
-            final String mappingFile = indexConfigPath + "/" + index + "/" + docType + ".json";
+            final String mappingFile = getResourcePath(indexConfigPath, fessConfig.getFesenType(), "/" + index + "/" + docType + ".json");
             try {
                 source = FileUtil.readUTF8(mappingFile);
             } catch (final Exception e) {
@@ -436,12 +466,13 @@ public class SearchEngineClient implements Client {
                     logger.warn("Failed to create {}/{} mapping.", indexName, docType);
                 }
 
-                final String dataPath = indexConfigPath + "/" + index + "/" + docType + ".bulk";
+                final String dataPath = getResourcePath(indexConfigPath, fessConfig.getFesenType(), "/" + index + "/" + docType + ".bulk");
                 if (ResourceUtil.isExist(dataPath)) {
                     insertBulkData(fessConfig, indexName, dataPath);
                 }
                 split(fessConfig.getAppExtensionNames(), ",").of(stream -> stream.filter(StringUtil::isNotBlank).forEach(name -> {
-                    final String bulkPath = indexConfigPath + "/" + index + "/" + docType + "_" + name + ".bulk";
+                    final String bulkPath =
+                            getResourcePath(indexConfigPath, fessConfig.getFesenType(), "/" + index + "/" + docType + "_" + name + ".bulk");
                     if (ResourceUtil.isExist(bulkPath)) {
                         insertBulkData(fessConfig, indexName, bulkPath);
                     }
@@ -480,7 +511,7 @@ public class SearchEngineClient implements Client {
     protected void createAlias(final String index, final String createdIndexName) {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         // alias
-        final String aliasConfigDirPath = indexConfigPath + "/" + index + "/alias";
+        final String aliasConfigDirPath = getResourcePath(indexConfigPath, fessConfig.getFesenType(), "/" + index + "/alias");
         try {
             final File aliasConfigDir = ResourceUtil.getResourceAsFile(aliasConfigDirPath);
             if (aliasConfigDir.isDirectory()) {
@@ -594,8 +625,19 @@ public class SearchEngineClient implements Client {
             } catch (final Exception e) {
                 cause = e;
             }
-            if (logger.isDebugEnabled()) {
-                logger.debug("Failed to access to Fesen:{}", i, cause);
+            if (cause instanceof FesenStatusException) {
+                final RestStatus status = ((FesenStatusException) cause).status();
+                switch (status) {
+                case UNAUTHORIZED:
+                    logger.warn("[{}] Unauthorized access: {}", i, System.getProperty(Constants.FESS_ES_HTTP_ADDRESS), cause);
+                    break;
+                default:
+                    logger.debug("[{}][{}] Failed to access to Fesen ({})", i, status, System.getProperty(Constants.FESS_ES_HTTP_ADDRESS),
+                            cause);
+                    break;
+                }
+            } else if (logger.isDebugEnabled()) {
+                logger.debug("[{}] Failed to access to Fesen ({})", i, System.getProperty(Constants.FESS_ES_HTTP_ADDRESS), cause);
             }
             ThreadUtil.sleep(1000L);
         }

+ 15 - 1
src/main/java/org/codelibs/fess/helper/CurlHelper.java

@@ -15,8 +15,13 @@
  */
 package org.codelibs.fess.helper;
 
+import java.nio.charset.StandardCharsets;
+
+import org.codelibs.core.lang.StringUtil;
 import org.codelibs.curl.Curl.Method;
 import org.codelibs.curl.CurlRequest;
+import org.codelibs.fess.mylasta.direction.FessConfig;
+import org.codelibs.fess.util.ComponentUtil;
 import org.codelibs.fess.util.ResourceUtil;
 
 public class CurlHelper {
@@ -38,6 +43,15 @@ public class CurlHelper {
     }
 
     public CurlRequest request(final Method method, final String path) {
-        return new CurlRequest(method, ResourceUtil.getFesenHttpUrl() + path);
+        final CurlRequest request = new CurlRequest(method, ResourceUtil.getFesenHttpUrl() + path);
+        final FessConfig fessConfig = ComponentUtil.getFessConfig();
+        final String username = fessConfig.getFesenUsername();
+        final String password = fessConfig.getFesenPassword();
+        if (StringUtil.isNotBlank(username) && StringUtil.isNotBlank(password)) {
+            final String value = username + ":" + password;
+            final String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(value.getBytes(StandardCharsets.UTF_8));
+            request.header("Authorization", basicAuth);
+        }
+        return request;
     }
 }

+ 1 - 1
src/main/java/org/codelibs/fess/helper/IndexingHelper.java

@@ -47,7 +47,7 @@ public class IndexingHelper {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         if (fessConfig.isResultCollapsed()) {
             docList.forEach(doc -> {
-                doc.put("content_minhash", doc.get(fessConfig.getIndexFieldContent()));
+                doc.put(fessConfig.getIndexFieldContentMinhash(), doc.get(fessConfig.getIndexFieldContent()));
             });
         }
         final long execTime = System.currentTimeMillis();

+ 1 - 0
src/main/java/org/codelibs/fess/helper/SuggestHelper.java

@@ -102,6 +102,7 @@ public class SuggestHelper {
                 .actionGet(fessConfig.getIndexHealthTimeout());
 
         final SuggestSettingsBuilder settingsBuilder = SuggestSettings.builder();
+        settingsBuilder.addInitialSettings("elasticsearch.type", fessConfig.getFesenType());
         settingsBuilder.bulkTimeout(fessConfig.getIndexBulkTimeout());
         settingsBuilder.clusterTimeout(fessConfig.getIndexHealthTimeout());
         settingsBuilder.indexTimeout(fessConfig.getIndexIndexTimeout());

+ 70 - 1
src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java

@@ -25,9 +25,18 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     /** The key of the configuration. e.g. Fess */
     String DOMAIN_TITLE = "domain.title";
 
+    /** The key of the configuration. e.g. default */
+    String ELASTICSEARCH_TYPE = "elasticsearch.type";
+
     /** The key of the configuration. e.g. http://localhost:9201 */
     String ELASTICSEARCH_HTTP_URL = "elasticsearch.http.url";
 
+    /** The key of the configuration. e.g.  */
+    String ELASTICSEARCH_USERNAME = "elasticsearch.username";
+
+    /** The key of the configuration. e.g.  */
+    String ELASTICSEARCH_PASSWORD = "elasticsearch.password";
+
     /** The key of the configuration. e.g. aes */
     String APP_CIPHER_ALGORISM = "app.cipher.algorism";
 
@@ -1694,14 +1703,51 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
      */
     String getDomainTitle();
 
+    /**
+     * Get the value for the key 'elasticsearch.type'. <br>
+     * The value is, e.g. default <br>
+     * comment: Fesen
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getFesenType();
+
     /**
      * Get the value for the key 'elasticsearch.http.url'. <br>
      * The value is, e.g. http://localhost:9201 <br>
-     * comment: Fesen
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      */
     String getFesenHttpUrl();
 
+    /**
+     * Get the value for the key 'elasticsearch.username'. <br>
+     * The value is, e.g.  <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getFesenUsername();
+
+    /**
+     * Get the value for the key 'elasticsearch.username' as {@link Integer}. <br>
+     * The value is, e.g.  <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     * @throws NumberFormatException When the property is not integer.
+     */
+    Integer getFesenUsernameAsInteger();
+
+    /**
+     * Get the value for the key 'elasticsearch.password'. <br>
+     * The value is, e.g.  <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getFesenPassword();
+
+    /**
+     * Get the value for the key 'elasticsearch.password' as {@link Integer}. <br>
+     * The value is, e.g.  <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     * @throws NumberFormatException When the property is not integer.
+     */
+    Integer getFesenPasswordAsInteger();
+
     /**
      * Get the value for the key 'app.cipher.algorism'. <br>
      * The value is, e.g. aes <br>
@@ -6961,10 +7007,30 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             return get(FessConfig.DOMAIN_TITLE);
         }
 
+        public String getFesenType() {
+            return get(FessConfig.ELASTICSEARCH_TYPE);
+        }
+
         public String getFesenHttpUrl() {
             return get(FessConfig.ELASTICSEARCH_HTTP_URL);
         }
 
+        public String getFesenUsername() {
+            return get(FessConfig.ELASTICSEARCH_USERNAME);
+        }
+
+        public Integer getFesenUsernameAsInteger() {
+            return getAsInteger(FessConfig.ELASTICSEARCH_USERNAME);
+        }
+
+        public String getFesenPassword() {
+            return get(FessConfig.ELASTICSEARCH_PASSWORD);
+        }
+
+        public Integer getFesenPasswordAsInteger() {
+            return getAsInteger(FessConfig.ELASTICSEARCH_PASSWORD);
+        }
+
         public String getAppCipherAlgorism() {
             return get(FessConfig.APP_CIPHER_ALGORISM);
         }
@@ -9713,7 +9779,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
         protected java.util.Map<String, String> prepareGeneratedDefaultMap() {
             java.util.Map<String, String> defaultMap = super.prepareGeneratedDefaultMap();
             defaultMap.put(FessConfig.DOMAIN_TITLE, "Fess");
+            defaultMap.put(FessConfig.ELASTICSEARCH_TYPE, "default");
             defaultMap.put(FessConfig.ELASTICSEARCH_HTTP_URL, "http://localhost:9201");
+            defaultMap.put(FessConfig.ELASTICSEARCH_USERNAME, "");
+            defaultMap.put(FessConfig.ELASTICSEARCH_PASSWORD, "");
             defaultMap.put(FessConfig.APP_CIPHER_ALGORISM, "aes");
             defaultMap.put(FessConfig.APP_CIPHER_KEY, "___change__me___");
             defaultMap.put(FessConfig.APP_DIGEST_ALGORISM, "sha256");

+ 8 - 1
src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java

@@ -338,7 +338,12 @@ public interface FessProp {
     }
 
     default boolean isResultCollapsed() {
-        return getSystemPropertyAsBoolean(Constants.RESULT_COLLAPSED_PROPERTY, false);
+        switch (getFesenType()) {
+        case Constants.FESEN_TYPE_CLOUD:
+            return false;
+        default:
+            return getSystemPropertyAsBoolean(Constants.RESULT_COLLAPSED_PROPERTY, false);
+        }
     }
 
     default void setLoginLinkEnabled(final boolean value) {
@@ -2071,4 +2076,6 @@ public interface FessProp {
         return !split(getPasswordInvalidAdminPasswords(), "\n")
                 .get(stream -> stream.map(String::trim).filter(StringUtil::isNotEmpty).anyMatch(s -> s.equals(password)));
     }
+
+    String getFesenType();
 }

+ 1 - 1
src/main/resources/crawler/es.xml

@@ -3,6 +3,6 @@
 	"http://dbflute.org/meta/lastadi10.dtd">
 <components>
 	<component name="esClient"
-		class="org.codelibs.fess.crawler.client.FesenClient">
+		class="org.codelibs.fess.es.client.CrawlerEngineClient">
 	</component>
 </components>

+ 3 - 0
src/main/resources/fess_config.properties

@@ -9,7 +9,10 @@
 domain.title = Fess
 
 # Elasticsearch
+elasticsearch.type=default
 elasticsearch.http.url=http://localhost:9201
+elasticsearch.username=
+elasticsearch.password=
 
 # Cryptographer
 app.cipher.algorism=aes

文件差異過大導致無法顯示
+ 17 - 0
src/main/resources/fess_indices/_cloud/fess.json


+ 592 - 0
src/main/resources/fess_indices/_cloud/fess/doc.json

@@ -0,0 +1,592 @@
+{
+    "dynamic_templates": [
+      {
+        "lang_ar": {
+          "match": "*_ar",
+          "mapping": {
+            "type": "text",
+            "analyzer": "arabic_analyzer"
+          }
+        }
+      },
+      {
+        "lang_bg": {
+          "match": "*_bg",
+          "mapping": {
+            "type": "text",
+            "analyzer": "bulgarian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_bn": {
+          "match": "*_bn",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ca": {
+          "match": "*_ca",
+          "mapping": {
+            "type": "text",
+            "analyzer": "catalan_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ca": {
+          "match": "*_ckb-iq",
+          "mapping": {
+            "type": "text",
+            "analyzer": "sorani_analyzer"
+          }
+        }
+      },
+      {
+        "lang_cs": {
+          "match": "*_cs",
+          "mapping": {
+            "type": "text",
+            "analyzer": "czech_analyzer"
+          }
+        }
+      },
+      {
+        "lang_da": {
+          "match": "*_da",
+          "mapping": {
+            "type": "text",
+            "analyzer": "danish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_de": {
+          "match": "*_de",
+          "mapping": {
+            "type": "text",
+            "analyzer": "german_analyzer"
+          }
+        }
+      },
+      {
+        "lang_el": {
+          "match": "*_el",
+          "mapping": {
+            "type": "text",
+            "analyzer": "greek_analyzer"
+          }
+        }
+      },
+      {
+        "lang_en": {
+          "match": "*_en",
+          "mapping": {
+            "type": "text",
+            "analyzer": "english_analyzer"
+          }
+        }
+      },
+      {
+        "lang_en": {
+          "match": "*_en-ie",
+          "mapping": {
+            "type": "text",
+            "analyzer": "irish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_es": {
+          "match": "*_es",
+          "mapping": {
+            "type": "text",
+            "analyzer": "spanish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_et": {
+          "match": "*_et",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_et": {
+          "match": "*_eu",
+          "mapping": {
+            "type": "text",
+            "analyzer": "basque_analyzer"
+          }
+        }
+      },
+      {
+        "lang_fa": {
+          "match": "*_fa",
+          "mapping": {
+            "type": "text",
+            "analyzer": "persian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_fi": {
+          "match": "*_fi",
+          "mapping": {
+            "type": "text",
+            "analyzer": "finnish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_fr": {
+          "match": "*_fr",
+          "mapping": {
+            "type": "text",
+            "analyzer": "french_analyzer"
+          }
+        }
+      },
+      {
+        "lang_gl": {
+          "match": "*_gl",
+          "mapping": {
+            "type": "text",
+            "analyzer": "galician_analyzer"
+          }
+        }
+      },
+      {
+        "lang_gu": {
+          "match": "*_gu",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_he": {
+          "match": "*_he",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_hi": {
+          "match": "*_hi",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_hr": {
+          "match": "*_hr",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_hu": {
+          "match": "*_hu",
+          "mapping": {
+            "type": "text",
+            "analyzer": "hungarian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_hu": {
+          "match": "*_hy",
+          "mapping": {
+            "type": "text",
+            "analyzer": "armenian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_id": {
+          "match": "*_id",
+          "mapping": {
+            "type": "text",
+            "analyzer": "indonesian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_it": {
+          "match": "*_it",
+          "mapping": {
+            "type": "text",
+            "analyzer": "italian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ja": {
+          "match": "*_ja",
+          "mapping": {
+            "type": "text",
+            "analyzer": "japanese_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ko": {
+          "match": "*_ko",
+          "mapping": {
+            "type": "text",
+            "analyzer": "korean_analyzer"
+          }
+        }
+      },
+      {
+        "lang_lt": {
+          "match": "*_lt",
+          "mapping": {
+            "type": "text",
+            "analyzer": "lithuanian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_lv": {
+          "match": "*_lv",
+          "mapping": {
+            "type": "text",
+            "analyzer": "latvian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_mk": {
+          "match": "*_mk",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ml": {
+          "match": "*_ml",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_nl": {
+          "match": "*_nl",
+          "mapping": {
+            "type": "text",
+            "analyzer": "dutch_analyzer"
+          }
+        }
+      },
+      {
+        "lang_no": {
+          "match": "*_no",
+          "mapping": {
+            "type": "text",
+            "analyzer": "norwegian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_pa": {
+          "match": "*_pa",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_pl": {
+          "match": "*_pl",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_pt": {
+          "match": "*_pt",
+          "mapping": {
+            "type": "text",
+            "analyzer": "portuguese_analyzer"
+          }
+        }
+      },
+      {
+        "lang_pt-br": {
+          "match": "*_pt-br",
+          "mapping": {
+            "type": "text",
+            "analyzer": "brazilian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ro": {
+          "match": "*_ro",
+          "mapping": {
+            "type": "text",
+            "analyzer": "romanian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ru": {
+          "match": "*_ru",
+          "mapping": {
+            "type": "text",
+            "analyzer": "russian_analyzer"
+          }
+        }
+      },
+      {
+        "lang_si": {
+          "match": "*_si",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_sq": {
+          "match": "*_sq",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_sv": {
+          "match": "*_sv",
+          "mapping": {
+            "type": "text",
+            "analyzer": "swedish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ta": {
+          "match": "*_ta",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_te": {
+          "match": "*_te",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_th": {
+          "match": "*_th",
+          "mapping": {
+            "type": "text",
+            "analyzer": "thai_analyzer"
+          }
+        }
+      },
+      {
+        "lang_tl": {
+          "match": "*_tl",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_tr": {
+          "match": "*_tr",
+          "mapping": {
+            "type": "text",
+            "analyzer": "turkish_analyzer"
+          }
+        }
+      },
+      {
+        "lang_uk": {
+          "match": "*_uk",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_ur": {
+          "match": "*_ur",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_vi": {
+          "match": "*_vi",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      },
+      {
+        "lang_zh-cn": {
+          "match": "*_zh-cn",
+          "mapping": {
+            "type": "text",
+            "analyzer": "simplified_chinese_analyzer"
+          }
+        }
+      },
+      {
+        "lang_zh-tw": {
+          "match": "*_zh-tw",
+          "mapping": {
+            "type": "text",
+            "analyzer": "empty_analyzer"
+          }
+        }
+      }
+    ],
+    "properties": {
+      "anchor": {
+        "type": "keyword"
+      },
+      "boost": {
+        "type": "float"
+      },
+      "click_count": {
+        "type": "long"
+      },
+      "config_id": {
+        "type": "keyword"
+      },
+      "important_content": {
+        "type": "text",
+        "analyzer": "standard_analyzer",
+        "search_analyzer": "standard_search_analyzer",
+        "term_vector": "with_positions_offsets"
+      },
+      "content": {
+        "type": "text",
+        "analyzer": "standard_analyzer",
+        "search_analyzer": "standard_search_analyzer",
+        "term_vector": "with_positions_offsets"
+      },
+      "content_minhash": {
+        "type": "keyword",
+        "index": false
+      },
+      "content_minhash_bits": {
+        "type": "keyword",
+        "index": false
+      },
+      "content_length": {
+        "type": "long"
+      },
+      "created": {
+        "type": "date",
+        "format": "date_optional_time"
+      },
+      "timestamp": {
+        "type": "date",
+        "format": "date_optional_time"
+      },
+      "expires": {
+        "type": "date",
+        "format": "date_optional_time"
+      },
+      "digest": {
+        "type": "text",
+        "index": false
+      },
+      "doc_id": {
+        "type": "keyword"
+      },
+      "favorite_count": {
+        "type": "long"
+      },
+      "filename": {
+        "type": "keyword"
+      },
+      "filetype": {
+        "type": "keyword"
+      },
+      "host": {
+        "type": "keyword"
+      },
+      "lang": {
+        "type": "keyword"
+      },
+      "last_modified": {
+        "type": "date",
+        "format": "date_optional_time"
+      },
+      "location": {
+        "type": "geo_point"
+      },
+      "mimetype": {
+        "type": "keyword"
+      },
+      "parent_id": {
+        "type": "keyword"
+      },
+      "role": {
+        "type": "keyword"
+      },
+      "label": {
+        "type": "keyword"
+      },
+      "virtual_host": {
+        "type": "keyword"
+      },
+      "segment": {
+        "type": "keyword"
+      },
+      "site": {
+        "type": "keyword"
+      },
+      "title": {
+        "type": "text",
+        "analyzer": "standard_analyzer",
+        "search_analyzer": "standard_search_analyzer",
+        "term_vector": "with_positions_offsets"
+      },
+      "thumbnail": {
+        "type": "keyword"
+      },
+      "url": {
+        "type": "keyword"
+      }
+    }
+}

+ 1707 - 0
src/main/resources/suggest_indices/_cloud/suggest_analyzer.json

@@ -0,0 +1,1707 @@
+{
+  "index": {
+    "refresh_interval": "1s",
+    "number_of_shards": 1,
+    "number_of_replicas": 0,
+    "auto_expand_replicas": "0-1"
+  },
+  "analysis" : {
+    "tokenizer" : {
+      "fess_japanese_normal" : {
+        "type" : "kuromoji_tokenizer",
+        "mode" : "normal",
+        "discard_punctuation" : "false"
+      },
+      "fess_korean_normal": {
+        "type": "nori_tokenizer",
+        "decompound_mode": "mixed",
+        "user_dictionary_rules": ["덕후", "버카충", "낄끼빠빠" ]
+      }
+    },
+    "analyzer" : {
+      "reading_analyzer" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "filter" : ["reading_form"]
+      },
+      "reading_term_analyzer" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal"
+      },
+      "normalize_analyzer" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter", "reading_form"]
+      },
+      "reading_analyzer_ja" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "filter" : ["reading_form"]
+      },
+      "reading_term_analyzer_ja" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal"
+      },
+      "normalize_analyzer_ja" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ja" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_ja" : {
+        "type" : "custom",
+        "tokenizer" : "fess_japanese_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "pos_filter", "content_length_filter", "limit_token_count_filter", "reading_form"]
+      },
+      "reading_analyzer_en" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_en" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_en" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_en" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "english_keywords"]
+      },
+      "contents_reading_analyzer_en" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "english_keywords"]
+      },
+      "reading_analyzer_ko" : {
+        "type" : "custom",
+        "tokenizer" : "fess_korean_normal"
+      },
+      "reading_term_analyzer_ko" : {
+        "type" : "custom",
+        "tokenizer" : "fess_korean_normal"
+      },
+      "normalize_analyzer_ko" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ko" : {
+        "type" : "custom",
+        "tokenizer" : "fess_korean_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "english_keywords"]
+      },
+      "contents_reading_analyzer_ko" : {
+        "type" : "custom",
+        "tokenizer" : "fess_korean_normal",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "english_keywords"]
+      },
+      "reading_analyzer_ar" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ar" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ar" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ar" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "arabic_stop", "arabic_keywords"]
+      },
+      "contents_reading_analyzer_ar" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "arabic_stop", "arabic_normalization", "arabic_keywords"]
+      },
+      "reading_analyzer_bg" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_bg" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_bg" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_bg" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter", "bulgarian_stop", "bulgarian_keywords", "bulgarian_stemmer"]
+      },
+      "contents_reading_analyzer_bg" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter", "bulgarian_stop", "bulgarian_keywords", "bulgarian_stemmer"]
+      },
+      "reading_analyzer_ca" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ca" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ca" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "catalan_elision"]
+      },
+      "contents_analyzer_ca" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "catalan_elision", "catalan_stop", "catalan_keywords"]
+      },
+      "contents_reading_analyzer_ca" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "catalan_elision", "catalan_stop", "catalan_keywords"]
+      },
+      "reading_analyzer_cs" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_cs" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_cs" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_cs" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "czech_stop", "czech_keywords"]
+      },
+      "contents_reading_analyzer_cs" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "czech_stop", "czech_keywords"]
+      },
+      "reading_analyzer_da" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_da" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_da" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_da" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "danish_stop", "danish_keywords"]
+      },
+      "contents_reading_analyzer_da" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "danish_stop", "danish_keywords"]
+      },
+      "reading_analyzer_nl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_nl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_nl" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "dutch_override"]
+      },
+      "contents_analyzer_nl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "dutch_stop", "dutch_keywords", "dutch_override"]
+      },
+      "contents_reading_analyzer_nl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "dutch_stop", "dutch_keywords", "dutch_override"]
+      },
+      "reading_analyzer_fi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_fi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_fi" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_fi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "finnish_stop", "finnish_keywords"]
+      },
+      "contents_reading_analyzer_fi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "finnish_stop", "finnish_keywords"]
+      },
+      "reading_analyzer_fr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_fr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_fr" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "french_elision"]
+      },
+      "contents_analyzer_fr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "french_elision", "french_stop", "french_keywords"]
+      },
+      "contents_reading_analyzer_fr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "french_elision", "french_stop", "french_keywords"]
+      },
+      "reading_analyzer_de" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_de" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_de" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_de" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "german_stop", "german_keywords"]
+      },
+      "contents_reading_analyzer_de" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "german_stop", "german_keywords", "german_normalization"]
+      },
+      "reading_analyzer_el" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_el" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_el" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["greek_lowercase", "lowercase"]
+      },
+      "contents_analyzer_el" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["greek_lowercase", "lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "greek_stop", "greek_keywords"]
+      },
+      "contents_reading_analyzer_el" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["greek_lowercase", "lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "greek_stop", "greek_keywords"]
+      },
+
+      "reading_analyzer_hu" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_hu" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_hu" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_hu" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "hungarian_stop", "hungarian_keywords"]
+      },
+      "contents_reading_analyzer_hu" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "hungarian_stop", "hungarian_keywords"]
+      },
+      "reading_analyzer_id" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_id" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_id" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_id" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "indonesian_stop", "indonesian_keywords"]
+      },
+      "contents_reading_analyzer_id" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "indonesian_stop", "indonesian_keywords"]
+      },
+      "reading_analyzer_it" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_it" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_it" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "italian_elision"]
+      },
+      "contents_analyzer_it" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "italian_elision", "italian_stop", "italian_keywords"]
+      },
+      "contents_reading_analyzer_it" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "italian_elision", "italian_stop", "italian_keywords"]
+      },
+      "reading_analyzer_lv" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_lv" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_lv" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_lv" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "latvian_stop", "latvian_keywords"]
+      },
+      "contents_reading_analyzer_lv" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "latvian_stop", "latvian_keywords"]
+      },
+      "reading_analyzer_lt" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_lt" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_lt" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_lt" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "lithuanian_stop", "lithuanian_keywords"]
+      },
+      "contents_reading_analyzer_lt" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "lithuanian_stop", "lithuanian_keywords"]
+      },
+      "reading_analyzer_no" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_no" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_no" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_no" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "norwegian_stop", "norwegian_keywords"]
+      },
+      "contents_reading_analyzer_no" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "norwegian_stop", "norwegian_keywords"]
+      },
+      "reading_analyzer_fa" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_fa" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_fa" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_fa" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "persian_stop"]
+      },
+      "contents_reading_analyzer_fa" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "arabic_normalization", "persian_normalization", "persian_stop"]
+      },
+      "reading_analyzer_pt" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_pt" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_pt" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_pt" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "portuguese_stop", "portuguese_keywords"]
+      },
+      "contents_reading_analyzer_pt" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "portuguese_stop", "portuguese_keywords"]
+      },
+      "reading_analyzer_ro" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ro" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ro" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ro" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "romanian_stop", "romanian_keywords"]
+      },
+      "contents_reading_analyzer_ro" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "romanian_stop", "romanian_keywords"]
+      },
+      "reading_analyzer_ru" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ru" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ru" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ru" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "russian_stop", "russian_keywords"]
+      },
+      "contents_reading_analyzer_ru" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "russian_stop", "russian_keywords"]
+      },
+      "reading_analyzer_es" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_es" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_es" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_es" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "spanish_stop", "spanish_keywords"]
+      },
+      "contents_reading_analyzer_es" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "spanish_stop", "spanish_keywords"]
+      },
+      "reading_analyzer_sv" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_sv" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_sv" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_sv" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "swedish_stop", "swedish_keywords"]
+      },
+      "contents_reading_analyzer_sv" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "swedish_stop", "swedish_keywords"]
+      },
+      "reading_analyzer_tr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_tr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_tr" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "apostrophe", "turkish_lowercase", "turkish_stemmer"]
+      },
+      "contents_analyzer_tr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "apostrophe", "turkish_lowercase", "turkish_stop", "turkish_keywords"]
+      },
+      "contents_reading_analyzer_tr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "apostrophe", "turkish_lowercase", "turkish_stop", "turkish_keywords"]
+      },
+      "reading_analyzer_th" : {
+        "type" : "custom",
+        "tokenizer" : "thai"
+      },
+      "reading_term_analyzer_th" : {
+        "type" : "custom",
+        "tokenizer" : "thai"
+      },
+      "normalize_analyzer_th" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_th" : {
+        "type" : "custom",
+        "tokenizer" : "thai",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "thai_stop"]
+      },
+      "contents_reading_analyzer_th" : {
+        "type" : "custom",
+        "tokenizer" : "thai",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "stopword_en_filter", "content_length_filter", "limit_token_count_filter", "thai_stop"]
+      },
+      "reading_analyzer_bn" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_bn" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_bn" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_bn" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_bn" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_et" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_et" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_et" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_et" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_et" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_gu" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_gu" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_gu" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_gu" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_gu" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_he" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_he" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_he" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_he" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_he" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_hi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_hi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_hi" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_hi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_hi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_hr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_hr" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_hr" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_hr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_hr" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_mk" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_mk" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_mk" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_mk" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_mk" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_ml" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ml" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ml" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ml" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_ml" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_pa" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_pa" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_pa" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_pa" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_pa" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_pl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_pl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_pl" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_pl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_pl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_si" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_si" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_si" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_si" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_si" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_sq" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_sq" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_sq" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_sq" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_sq" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_ta" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ta" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ta" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ta" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_ta" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_te" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_te" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_te" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_te" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_te" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_tl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_tl" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_tl" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_tl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_tl" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_uk" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_uk" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_uk" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_uk" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_uk" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_ur" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_ur" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_ur" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_ur" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_ur" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_vi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_vi" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_vi" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_vi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_vi" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_zh-cn" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_zh-cn" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_zh-cn" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_zh-cn" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_zh-cn" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "reading_analyzer_zh-tw" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "reading_term_analyzer_zh-tw" : {
+        "type" : "custom",
+        "tokenizer" : "standard"
+      },
+      "normalize_analyzer_zh-tw" : {
+        "type" : "custom",
+        "tokenizer" : "keyword",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase"]
+      },
+      "contents_analyzer_zh-tw" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      },
+      "contents_reading_analyzer_zh-tw" : {
+        "type" : "custom",
+        "tokenizer" : "standard",
+        "char_filter" : ["mapping_char"],
+        "filter" : ["lowercase", "content_length_filter", "limit_token_count_filter"]
+      }
+    },
+    "char_filter" : {
+      "mapping_char" : {
+        "type" : "mapping",
+        "mappings" : ["ガ=>ガ", "ギ=>ギ", "グ=>グ", "ゲ=>ゲ", "ゴ=>ゴ", "ザ=>ザ", "ジ=>ジ", "ズ=>ズ", "ゼ=>ゼ", "ゾ=>ゾ", "ダ=>ダ", "ヂ=>ヂ", "ヅ=>ヅ",
+          "デ=>デ", "ド=>ド", "バ=>バ", "ビ=>ビ", "ブ=>ブ", "ベ=>ベ", "ボ=>ボ", "。=>。", "「=>「", "」=>」", "、=>、", "・=>・", "ヲ=>ヲ", "ァ=>ァ", "ィ=>ィ", "ゥ=>ゥ", "ェ=>ェ", "ォ=>ォ", "ャ=>ャ", "ュ=>ュ", "ョ=>ョ", "ッ=>ッ", "ア=>ア",
+          "イ=>イ", "ウ=>ウ", "エ=>エ", "オ=>オ", "カ=>カ", "キ=>キ", "ク=>ク", "ケ=>ケ", "コ=>コ", "サ=>サ", "シ=>シ", "ス=>ス", "セ=>セ", "ソ=>ソ", "タ=>タ", "チ=>チ", "ツ=>ツ", "テ=>テ", "ト=>ト", "ナ=>ナ", "ニ=>ニ", "ヌ=>ヌ", "ネ=>ネ", "ノ=>ノ", "ハ=>ハ",
+          "ヒ=>ヒ", "フ=>フ", "ヘ=>ヘ", "ホ=>ホ", "マ=>マ", "ミ=>ミ", "ム=>ム", "メ=>メ", "モ=>モ", "ヤ=>ヤ", "ユ=>ユ", "ヨ=>ヨ", "ラ=>ラ", "リ=>リ", "ル=>ル", "レ=>レ", "ロ=>ロ", "ワ=>ワ", "ン=>ン",
+          "a=>a", "b=>b","c=>c","d=>d","e=>e","f=>f","g=>g","h=>h","i=>i","j=>j","k=>k","l=>l","m=>m","n=>n","o=>o","p=>p","q=>q","r=>r","s=>s",
+          "t=>t","u=>u","v=>v","w=>w","x=>x", "y=>y", "z=>z",
+          "A=>A", "B=>B","C=>C","D=>D","E=>E","F=>F","G=>g","H=>H","I=>I","J=>j","K=>k","L=>L","M=>M","N=>N","O=>O","P=>P","Q=>Q","R=>R","S=>S",
+          "T=>T","U=>U","V=>V","W=>W","X=>X", "Y=>Y", "Z=>Z",
+          "1=>1", "2=>2", "3=>3", "4=>4", "5=>5", "6=>6", "7=>7", "8=>8", "9=>9", "0=>0"
+        ]
+      }
+    },
+    "filter" : {
+      "reading_form" : {
+        "type" : "kuromoji_readingform"
+      },
+      "pos_filter" : {
+        "type" : "kuromoji_part_of_speech",
+        "stoptags" : [
+          "その他",
+          "その他-間投",
+          "フィラー",
+          "感動詞",
+          "記号",
+          "記号-アルファベット",
+          "記号-一般",
+          "記号-括弧開",
+          "記号-括弧閉",
+          "記号-句点",
+          "記号-空白",
+          "記号-読点",
+          "形容詞",
+          "形容詞-接尾",
+          "形容詞-非自立",
+          "語断片",
+          "助詞",
+          "助詞-格助詞",
+          "助詞-格助詞-一般",
+          "助詞-格助詞-引用",
+          "助詞-格助詞-連語",
+          "助詞-間投助詞",
+          "助詞-係助詞",
+          "助詞-終助詞",
+          "助詞-接続助詞",
+          "助詞-特殊",
+          "助詞-副詞化",
+          "助詞-副助詞",
+          "助詞-副助詞/並立助詞/終助詞",
+          "助詞-並立助詞",
+          "助詞-連体化",
+          "助動詞",
+          "接続詞",
+          "接頭詞",
+          "接頭詞-形容詞接続",
+          "接頭詞-数接続",
+          "接頭詞-動詞接続",
+          "接頭詞-名詞接続",
+          "動詞",
+          "動詞-自立",
+          "動詞-接尾",
+          "動詞-非自立",
+          "非言語音",
+          "副詞",
+          "副詞-一般",
+          "副詞-助詞類接続",
+          "名詞-ナイ形容詞語幹",
+          "名詞-引用文字列",
+          "名詞-形容動詞語幹",
+          "名詞-数",
+          "名詞-接続詞的",
+          "名詞-接尾",
+          "名詞-接尾-サ変接続",
+          "名詞-接尾-一般",
+          "名詞-接尾-形容動詞語幹",
+          "名詞-接尾-助数詞",
+          "名詞-接尾-助動詞語幹",
+          "名詞-接尾-人名",
+          "名詞-接尾-地域",
+          "名詞-接尾-特殊",
+          "名詞-接尾-副詞可能",
+          "名詞-代名詞",
+          "名詞-代名詞-一般",
+          "名詞-代名詞-縮約",
+          "名詞-動詞非自立的",
+          "名詞-特殊",
+          "名詞-特殊-助動詞語幹",
+          "名詞-非自立",
+          "名詞-非自立-一般",
+          "名詞-非自立-形容動詞語幹",
+          "名詞-非自立-助動詞語幹",
+          "名詞-非自立-副詞可能",
+          "名詞-副詞可能",
+          "連体詞"
+        ]
+      },
+      "stopword_en_filter": {
+        "type": "stop",
+        "stopwords": "_english_"
+      },
+      "content_length_filter": {
+        "type": "length",
+        "max": 30
+      },
+      "limit_token_count_filter": {
+        "type": "limit",
+        "max_token_count": 2147483647
+      },
+      "stemmer_en_filter": {
+        "type": "stemmer",
+        "name": "english"
+      },
+      "arabic_stop": {
+        "type":       "stop",
+        "stopwords":  "_arabic_"
+      },
+      "arabic_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["ﻡﺮﺤﺑﺍﺍ", "ﻉﺎﻠﻣ", "ﺐﺤﺛ"]
+      },
+      "arabic_stemmer": {
+        "type":       "stemmer",
+        "language":   "arabic"
+      },
+      "bulgarian_stop": {
+        "type":       "stop",
+        "stopwords":  "_bulgarian_"
+      },
+      "bulgarian_keywords": {
+        "type":       "keyword_marker",
+        "keywords":   ["Добър ден"]
+      },
+      "bulgarian_stemmer": {
+        "type":       "stemmer",
+        "language":   "bulgarian"
+      },
+      "catalan_elision": {
+        "type":         "elision",
+        "articles": [ "d", "l", "m", "n", "s", "t"]
+      },
+      "catalan_stop": {
+        "type":       "stop",
+        "stopwords":  "_catalan_"
+      },
+      "catalan_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Hola", "món", "recerca"]
+      },
+      "catalan_stemmer": {
+        "type":       "stemmer",
+        "language":   "catalan"
+      },
+      "czech_stop": {
+        "type":       "stop",
+        "stopwords":  "_czech_"
+      },
+      "czech_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Haló", "svět", "vyhledávání"]
+      },
+      "czech_stemmer": {
+        "type":       "stemmer",
+        "language":   "czech"
+      },
+      "danish_stop": {
+        "type":       "stop",
+        "stopwords":  "_danish_"
+      },
+      "danish_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Hej", "verden", "Søg"]
+      },
+      "danish_stemmer": {
+        "type":       "stemmer",
+        "language":   "danish"
+      },
+      "dutch_stop": {
+        "type":       "stop",
+        "stopwords":  "_dutch_"
+      },
+      "dutch_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["hallo", "wereld", "zoeken"]
+      },
+      "dutch_stemmer": {
+        "type":       "stemmer",
+        "language":   "dutch"
+      },
+      "dutch_override": {
+        "type":       "stemmer_override",
+        "rules": [
+          "fiets=>fiets",
+          "bromfiets=>bromfiets",
+          "ei=>eier",
+          "kind=>kinder"
+        ]
+      },
+      "english_keywords": {
+        "type":       "keyword_marker",
+        "keywords":   ["hello"]
+      },
+      "finnish_stop": {
+        "type":       "stop",
+        "stopwords":  "_finnish_"
+      },
+      "finnish_keywords": {
+        "type":       "keyword_marker",
+        "keywords":   ["Hei"]
+      },
+      "finnish_stemmer": {
+        "type":       "stemmer",
+        "language":   "finnish"
+      },
+      "french_elision": {
+        "type":         "elision",
+        "articles_case": true,
+        "articles": [
+          "l", "m", "t", "qu", "n", "s",
+          "j", "d", "c", "jusqu", "quoiqu",
+          "lorsqu", "puisqu"
+        ]
+      },
+      "french_stop": {
+        "type":       "stop",
+        "stopwords":  "_french_"
+      },
+      "french_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Bonjour", "monde", "recherche"]
+      },
+      "french_stemmer": {
+        "type":       "stemmer",
+        "language":   "light_french"
+      },
+      "german_stop": {
+        "type":       "stop",
+        "stopwords":  "_german_"
+      },
+      "german_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Hallo", "Welt", "Suche"]
+      },
+      "german_stemmer": {
+        "type":       "stemmer",
+        "language":   "light_german"
+      },
+      "greek_stop": {
+        "type":       "stop",
+        "stopwords":  "_greek_"
+      },
+      "greek_lowercase": {
+        "type":       "lowercase",
+        "language":   "greek"
+      },
+      "greek_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Γεια σας", "κόσμος", "έρευνα"]
+      },
+      "greek_stemmer": {
+        "type":       "stemmer",
+        "language":   "greek"
+      },
+      "hindi_stop": {
+        "type":       "stop",
+        "stopwords":  "_hindi_"
+      },
+      "hungarian_stop": {
+        "type":       "stop",
+        "stopwords":  "_hungarian_"
+      },
+      "hungarian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Helló", "világ", "keresés"]
+      },
+      "hungarian_stemmer": {
+        "type":       "stemmer",
+        "language":   "hungarian"
+      },
+      "indonesian_stop": {
+        "type":       "stop",
+        "stopwords":  "_indonesian_"
+      },
+      "indonesian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["halo", "dunia", "pencarian"]
+      },
+      "indonesian_stemmer": {
+        "type":       "stemmer",
+        "language":   "indonesian"
+      },
+      "italian_elision": {
+        "type":         "elision",
+        "articles": [
+          "c", "l", "all", "dall", "dell",
+          "nell", "sull", "coll", "pell",
+          "gl", "agl", "dagl", "degl", "negl",
+          "sugl", "un", "m", "t", "s", "v", "d"
+        ]
+      },
+      "italian_stop": {
+        "type":       "stop",
+        "stopwords":  "_italian_"
+      },
+      "italian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Ciao", "mondo", "ricerca"]
+      },
+      "italian_stemmer": {
+        "type":       "stemmer",
+        "language":   "light_italian"
+      },
+      "latvian_stop": {
+        "type":       "stop",
+        "stopwords":  "_latvian_"
+      },
+      "latvian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["sveiki", "pasaule", "meklēšana"]
+      },
+      "latvian_stemmer": {
+        "type":       "stemmer",
+        "language":   "latvian"
+      },
+      "lithuanian_stop": {
+        "type":       "stop",
+        "stopwords":  "_lithuanian_"
+      },
+      "lithuanian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Sveiki", "pasaulis", "paieška"]
+      },
+      "lithuanian_stemmer": {
+        "type":       "stemmer",
+        "language":   "lithuanian"
+      },
+      "norwegian_stop": {
+        "type":       "stop",
+        "stopwords":  "_norwegian_"
+      },
+      "norwegian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Hallo", "verden", "Søk"]
+      },
+      "norwegian_stemmer": {
+        "type":       "stemmer",
+        "language":   "norwegian"
+      },
+      "persian_stop": {
+        "type":       "stop",
+        "stopwords":  "_persian_"
+      },
+      "portuguese_stop": {
+        "type":       "stop",
+        "stopwords":  "_portuguese_"
+      },
+      "portuguese_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Olá", "mundo", "pesquisa"]
+      },
+      "portuguese_stemmer": {
+        "type":       "stemmer",
+        "language":   "light_portuguese"
+      },
+      "romanian_stop": {
+        "type":       "stop",
+        "stopwords":  "_romanian_"
+      },
+      "romanian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Alo", "lume", "căutare"]
+      },
+      "romanian_stemmer": {
+        "type":       "stemmer",
+        "language":   "romanian"
+      },
+      "russian_stop": {
+        "type":       "stop",
+        "stopwords":  "_russian_"
+      },
+      "russian_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["привет", "мир", "поиск"]
+      },
+      "russian_stemmer": {
+        "type":       "stemmer",
+        "language":   "russian"
+      },
+      "spanish_stop": {
+        "type":       "stop",
+        "stopwords":  "_spanish_"
+      },
+      "spanish_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["¡Hola", "mundo", "búsqueda"]
+      },
+      "spanish_stemmer": {
+        "type":       "stemmer",
+        "language":   "light_spanish"
+      },
+      "swedish_stop": {
+        "type":       "stop",
+        "stopwords":  "_swedish_"
+      },
+      "swedish_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Hallå", "material", "sök"]
+      },
+      "swedish_stemmer": {
+        "type":       "stemmer",
+        "language":   "swedish"
+      },
+      "turkish_stop": {
+        "type":       "stop",
+        "stopwords":  "_turkish_"
+      },
+      "turkish_lowercase": {
+        "type":       "lowercase",
+        "language":   "turkish"
+      },
+      "turkish_keywords": {
+        "type":       "keyword_marker",
+        "keywords": ["Merhaba", "Dünya", "arama"]
+      },
+      "turkish_stemmer": {
+        "type":       "stemmer",
+        "language":   "turkish"
+      },
+      "thai_stop": {
+        "type":       "stop",
+        "stopwords":  "_thai_"
+      }
+    }
+  }
+}

+ 1 - 1
src/main/webapp/WEB-INF/view/admin/general/admin_general.jsp

@@ -84,7 +84,7 @@
                                     <div class="form-inline col-sm-9">
                                         <la:errors property="resultCollapsed"/>
                                         <div class="form-check">
-                                            <la:checkbox styleId="resultCollapsed" styleClass="form-check-input" property="resultCollapsed"/>
+                                            <la:checkbox styleId="resultCollapsed" styleClass="form-check-input" property="resultCollapsed" disabled="${fesenType=='cloud'}"/>
                                             <label for="resultCollapsed" class="form-check-label">
                                                 <la:message key="labels.enabled"/>
                                             </label>

+ 1 - 1
src/main/webapp/WEB-INF/view/admin/maintenance/admin_maintenance.jsp

@@ -63,7 +63,7 @@
                                     <div class="form-inline col-sm-9">
                                         <la:errors property="resetDictionaries"/>
                                         <div class="form-check">
-                                            <la:checkbox styleId="resetDictionaries" styleClass="form-check-input" property="resetDictionaries"/>
+                                            <la:checkbox styleId="resetDictionaries" styleClass="form-check-input" property="resetDictionaries" disabled="${fesenType=='cloud'}"/>
                                             <label for="resetDictionaries" class="form-check-label">
                                                 <la:message key="labels.enabled"/>
                                             </label>

+ 1 - 1
src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp

@@ -75,7 +75,7 @@
 							<p><la:message key="labels.menu_design" /></p>
 						</a></li></c:if>
 						
-					<c:if test="${fe:permission('admin-dict-view')}">
+					<c:if test="${fe:permission('admin-dict-view') and fesenType!='cloud'}">
 					<li class="nav-item">
 						<a href="${fe:url('/admin/dict/')}" class="nav-link <c:if test="${param.menuType=='dict'}">active</c:if>">
 							<em class='fa fa-genderless nav-icon'></em>

部分文件因文件數量過多而無法顯示