/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you 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.elasticsearch.ingest; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.env.Environment; import org.elasticsearch.index.analysis.AnalysisRegistry; import org.elasticsearch.test.ESTestCase; import java.util.HashMap; import java.util.Map; import static java.util.Collections.emptyMap; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.startsWith; public class AnalyzerProcessorFactoryTests extends ESTestCase { private final Settings settings = Settings.builder() .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString()) .build(); private final AnalysisRegistry analysisRegistry = new AnalysisRegistry(new Environment(settings), emptyMap(), emptyMap(), emptyMap(), emptyMap()); public void testCreate() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); ingestAnalysisService.setAnalysisSettings(settings); Map<String, Object> config = new HashMap<>(); config.put("field", "field1"); config.put("target_field", "field2"); config.put("analyzer", "standard"); String processorTag = randomAsciiOfLength(10); AnalyzerProcessor analyzerProcessor = factory.create(null, processorTag, config); assertThat(analyzerProcessor.getTag(), equalTo(processorTag)); assertThat(analyzerProcessor.getField(), equalTo("field1")); assertThat(analyzerProcessor.getTargetField(), equalTo("field2")); assertThat(analyzerProcessor.getAnalyzer(), equalTo("standard")); } } public void testCreateWithCustomAnalyzer() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); final Settings ingestSettings = Settings.builder() .put("analyzer.my_analyzer.type", "custom") .put("analyzer.my_analyzer.tokenizer", "keyword") .build(); ingestAnalysisService.setAnalysisSettings(ingestSettings); Map<String, Object> config = new HashMap<>(); config.put("field", "field1"); config.put("analyzer", "my_analyzer"); String processorTag = randomAsciiOfLength(10); AnalyzerProcessor analyzerProcessor = factory.create(null, processorTag, config); assertThat(analyzerProcessor.getTag(), equalTo(processorTag)); assertThat(analyzerProcessor.getField(), equalTo("field1")); assertThat(analyzerProcessor.getTargetField(), equalTo("field1")); assertThat(analyzerProcessor.getAnalyzer(), equalTo("my_analyzer")); } } public void testCreateNoFieldPresent() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); ingestAnalysisService.setAnalysisSettings(settings); Map<String, Object> config = new HashMap<>(); config.put("analyzer", "standard"); String processorTag = randomAsciiOfLength(10); try { factory.create(null, processorTag, config); fail("factory create should have failed"); } catch (ElasticsearchParseException e) { assertThat(e.getMessage(), equalTo("[field] required property is missing")); } } } public void testCreateNoAnalyzerPresent() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); ingestAnalysisService.setAnalysisSettings(settings); Map<String, Object> config = new HashMap<>(); config.put("field", "field1"); String processorTag = randomAsciiOfLength(10); try { factory.create(null, processorTag, config); fail("factory create should have failed"); } catch (ElasticsearchParseException e) { assertThat(e.getMessage(), equalTo("[analyzer] required property is missing")); } } } public void testCreateWithUnknownAnalyzer() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); ingestAnalysisService.setAnalysisSettings(settings); Map<String, Object> config = new HashMap<>(); config.put("field", "field1"); config.put("analyzer", "unknown_analyzer"); String processorTag = randomAsciiOfLength(10); try { factory.create(null, processorTag, config); fail("factory create should have failed"); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), equalTo("Unknown analyzer [unknown_analyzer]")); } } } public void testUpdateCustomAnalyzer() throws Exception { try (IngestAnalysisService ingestAnalysisService = new IngestAnalysisService(settings)) { AnalyzerProcessor.Factory factory = new AnalyzerProcessor.Factory(ingestAnalysisService); ingestAnalysisService.setAnalysisRegistry(analysisRegistry); ingestAnalysisService.setAnalysisSettings(Settings.EMPTY); Map<String, Object> config = new HashMap<>(); config.put("field", "field1"); config.put("analyzer", "my_analyzer"); String processorTag = randomAsciiOfLength(10); try { factory.create(null, processorTag, config); fail("factory create should have failed"); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), equalTo("Unknown analyzer [my_analyzer]")); } // Add new custom analyzer final Settings ingestSettings = Settings.builder() .put("analyzer.my_analyzer.type", "custom") .put("analyzer.my_analyzer.tokenizer", "keyword") .build(); ingestAnalysisService.setAnalysisSettings(ingestSettings); config = new HashMap<>(); config.put("field", "field1"); config.put("analyzer", "my_analyzer"); AnalyzerProcessor analyzerProcessor = factory.create(null, processorTag, config); assertThat(analyzerProcessor.getTag(), equalTo(processorTag)); assertThat(analyzerProcessor.getField(), equalTo("field1")); assertThat(analyzerProcessor.getTargetField(), equalTo("field1")); assertThat(analyzerProcessor.getAnalyzer(), equalTo("my_analyzer")); // Try adding bogus custom settings final Settings bogusIngestSettings = Settings.builder() .put("analyzer.bogus_analyzer.type", "custom") .put("analyzer.bogus_analyzer.tokenizer", "unknown_tokenizer") .build(); try { ingestAnalysisService.setAnalysisSettings(bogusIngestSettings); fail("Update should have failed"); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), startsWith("Couldn't parse ingest analyzer definition")); } // The old definitions should still work config = new HashMap<>(); config.put("field", "field1"); config.put("analyzer", "my_analyzer"); analyzerProcessor = factory.create(null, processorTag, config); assertThat(analyzerProcessor.getTag(), equalTo(processorTag)); assertThat(analyzerProcessor.getField(), equalTo("field1")); assertThat(analyzerProcessor.getTargetField(), equalTo("field1")); assertThat(analyzerProcessor.getAnalyzer(), equalTo("my_analyzer")); } } }