/** * Copyright 2011 Molindo GmbH * * 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 at.molindo.elastic.compass; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.List; import org.compass.core.CompassToken; import org.compass.core.Resource; import org.compass.core.engine.SearchEngineAnalyzerHelper; import org.compass.core.engine.SearchEngineException; import org.compass.core.mapping.ResourceAnalyzerController; import org.compass.core.mapping.ResourceMapping; import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse.AnalyzeToken; import at.molindo.utils.io.ReaderUtils; /** * @author kimchy */ public class ElasticSearchEngineAnalyzerHelper implements SearchEngineAnalyzerHelper { private ElasticSearchEngine _searchEngine; private String _analyzer; public ElasticSearchEngineAnalyzerHelper(ElasticSearchEngine searchEngine) { _searchEngine = searchEngine; } public SearchEngineAnalyzerHelper setAnalyzer(String analyzerName) { _analyzer = analyzerName; return this; } public SearchEngineAnalyzerHelper setAnalyzer(Resource resource) throws SearchEngineException { String alias = resource.getAlias(); ResourceMapping resourceMapping = _searchEngine.getSearchEngineFactory().getMapping().getRootMappingByAlias(alias); if (resourceMapping.getAnalyzerController() == null) { _analyzer = getAnalyzerByMapping(resourceMapping); } else { ResourceAnalyzerController analyzerController = resourceMapping.getAnalyzerController(); String analyzerPropertyName = analyzerController.getAnalyzerResourcePropertyName(); String analyzerName = resource.getValue(analyzerPropertyName); if (analyzerName == null) { analyzerName = analyzerController.getNullAnalyzer(); } _analyzer = analyzerName; } return this; } private String getAnalyzerByMapping(ResourceMapping resourceMapping) { if (resourceMapping.getAnalyzer() != null) { return resourceMapping.getAnalyzer(); } else { return ElasticEnvironment.Analyzer.DEFAULT_GROUP; } } public SearchEngineAnalyzerHelper setAnalyzerByAlias(String alias) throws SearchEngineException { _analyzer = getAnalyzerByMapping(_searchEngine.getSearchEngineFactory().getMapping().getRootMappingByAlias(alias)); return this; } public CompassToken analyzeSingle(String text) throws SearchEngineException { CompassToken[] tokens = analyze(text); if (tokens == null || tokens.length == 0) { return null; } return tokens[0]; } public CompassToken[] analyze(String text) { return analyze(new StringReader(text)); } public CompassToken[] analyze(String propertyName, String text) throws SearchEngineException { List<AnalyzeToken> tokens = _searchEngine.analyze(_analyzer, text); CompassToken[] cTokens = new CompassToken[tokens.size()]; int i = 0; for (AnalyzeToken token : tokens) { cTokens[i++] = new ElasticToken(token); } return cTokens; } public CompassToken[] analyze(Reader textReader) throws SearchEngineException { return analyze(null, textReader); } public CompassToken[] analyze(String propertyName, Reader textReader) throws SearchEngineException { try { return analyze(propertyName, ReaderUtils.text(textReader)); } catch (IOException e) { throw new SearchEngineException("failed to read text from reader", e); } } }