All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.elasticsearch.plugin.GermanAnalyzersPlugin Maven / Gradle / Ivy

The newest version!
/*
 * Made with all the love in the world
 * by scireum in Remshalden, Germany
 *
 * Copyright by scireum GmbH
 * http://www.scireum.de - [email protected]
 */

package org.elasticsearch.plugin;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.util.SetOnce;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.index.analysis.AnalyzerProvider;
import org.elasticsearch.indices.analysis.AnalysisModule;
import org.elasticsearch.plugins.AnalysisPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.SearchPlugin;
import org.elasticsearch.script.ScriptService;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.watcher.ResourceWatcherService;
import sirius.nlp.query.FuzzyAwareMatchQueryBuilder;
import sirius.nlp.service.UpdateSynonymsService;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Provides analyzers for ElasticSearch as a plugin.
 */
public class GermanAnalyzersPlugin extends Plugin implements AnalysisPlugin, SearchPlugin {

    /**
     * analyzer for standard indexing
     */
    public static final String STANDARD_INDEXING = "german_indexing_analyzer";
    /**
     * analyzer for primary word indexing
     */
    public static final String PRIMARY_WORD = "german_primary_word_indexing_analyzer";
    /**
     * analyzer for autocompletion indexing
     */
    public static final String AUTOCOMPLETE = "german_autocomplete_analyzer";
    /**
     * search analyzer
     */
    public static final String SEARCH = "german_search_analyzer";
    /**
     * search analyzer which injects fuzzy queries
     */
    public static final String FUZZY_AWARE_SEARCH = "german_fuzzy_aware_search_analyzer";
    /**
     * analyzer for query suggestion
     */
    public static final String SUGGEST = "german_suggest_analyzer";

    private SetOnce synonymService = new SetOnce<>();

    @Override
    public Map>> getAnalyzers() {
        Map>> analyzers = new HashMap<>();

        analyzers.put(STANDARD_INDEXING, GermanIndexingAnalyzerProvider::new);
        analyzers.put(PRIMARY_WORD, GermanPrimaryWordOnlyIndexingAnalyzerProvider::new);
        analyzers.put(AUTOCOMPLETE, GermanAutocompleteIndexingAnalyzerProvider::new);
        analyzers.put(SEARCH, new AnalysisModule.AnalysisProvider>() {
            @Override
            public AnalyzerProvider get(IndexSettings indexSettings,
                                                            Environment environment,
                                                            String name,
                                                            Settings settings) throws IOException {
                synonymService.get()
                              .setSynonymFile(environment.configFile().resolve("sirius-sirius.nlp/synonym/custom.txt"));
                return new GermanSearchAnalyzerProvider(indexSettings,
                                                        environment,
                                                        name,
                                                        settings,
                                                        synonymService.get());
            }
        });
        analyzers.put(FUZZY_AWARE_SEARCH, new AnalysisModule.AnalysisProvider>() {
            @Override
            public AnalyzerProvider get(IndexSettings indexSettings,
                                                            Environment environment,
                                                            String name,
                                                            Settings settings) throws IOException {
                return new GermanFuzzyAwareSearchAnalyzerProvider(indexSettings,
                                                                  environment,
                                                                  name,
                                                                  settings,
                                                                  synonymService.get());
            }
        });
        analyzers.put(SUGGEST, GermanSuggestAnalyzerProvider::new);

        return analyzers;
    }

    @Override
    public List> getQueries() {
        List> queries = new ArrayList<>();
        queries.add(new QuerySpec<>(FuzzyAwareMatchQueryBuilder.NAME,
                                    FuzzyAwareMatchQueryBuilder::new,
                                    FuzzyAwareMatchQueryBuilder::fromXContent));

        return queries;
    }

    @Override
    public Collection createComponents(Client client,
                                               ClusterService clusterService,
                                               ThreadPool threadPool,
                                               ResourceWatcherService resourceWatcherService,
                                               ScriptService scriptService,
                                               NamedXContentRegistry xContentRegistry) {
        synonymService.set(new UpdateSynonymsService(resourceWatcherService));
        return Collections.singleton(synonymService.get());
    }
}