/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.search.elasticsearch.internal.suggest; import com.liferay.portal.kernel.search.query.QueryTranslator; import com.liferay.portal.kernel.search.suggest.PhraseSuggester; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.search.elasticsearch.suggest.PhraseSuggesterTranslator; import java.util.Set; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.suggest.SuggestBuilders; import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; import org.osgi.service.component.annotations.ReferencePolicyOption; /** * @author Michael C. Han */ @Component(immediate = true, service = PhraseSuggesterTranslator.class) public class PhraseSuggesterTranslatorImpl extends BaseSuggesterTranslatorImpl implements PhraseSuggesterTranslator { @Override public SuggestBuilder translate(PhraseSuggester phraseSuggester) { SuggestBuilder suggestBuilder = new SuggestBuilder( phraseSuggester.getName()); PhraseSuggestionBuilder phraseSuggestionBuilder = SuggestBuilders.phraseSuggestion(phraseSuggester.getName()); phraseSuggestionBuilder.field(phraseSuggester.getField()); if (Validator.isNotNull(phraseSuggester.getAnalyzer())) { phraseSuggestionBuilder.analyzer(phraseSuggester.getAnalyzer()); } translate( phraseSuggester.getCandidateGenerators(), phraseSuggestionBuilder); translate(phraseSuggester.getCollate(), phraseSuggestionBuilder); if (phraseSuggester.getConfidence() != null) { phraseSuggestionBuilder.confidence(phraseSuggester.getConfidence()); } if (phraseSuggester.isForceUnigrams() != null) { phraseSuggestionBuilder.forceUnigrams( phraseSuggester.isForceUnigrams()); } if (phraseSuggester.getGramSize() != null) { phraseSuggestionBuilder.gramSize(phraseSuggester.getGramSize()); } if (phraseSuggester.getMaxErrors() != null) { phraseSuggestionBuilder.maxErrors(phraseSuggester.getMaxErrors()); } if (Validator.isNotNull(phraseSuggester.getPostHighlightFilter()) && Validator.isNotNull(phraseSuggester.getPreHighlightFilter())) { phraseSuggestionBuilder.highlight( phraseSuggester.getPreHighlightFilter(), phraseSuggester.getPostHighlightFilter()); } if (phraseSuggester.getRealWordErrorLikelihood() != null) { phraseSuggestionBuilder.realWordErrorLikelihood( phraseSuggester.getRealWordErrorLikelihood()); } if (phraseSuggester.getSeparator() != null) { phraseSuggestionBuilder.separator(phraseSuggester.getSeparator()); } if (phraseSuggester.getShardSize() != null) { phraseSuggestionBuilder.shardSize(phraseSuggester.getShardSize()); } if (phraseSuggester.getSize() != null) { phraseSuggestionBuilder.size(phraseSuggester.getSize()); } if (phraseSuggester.getTokenLimit() != null) { phraseSuggestionBuilder.tokenLimit(phraseSuggester.getTokenLimit()); } phraseSuggestionBuilder.text(phraseSuggester.getValue()); suggestBuilder.addSuggestion(phraseSuggestionBuilder); return suggestBuilder; } protected void translate( PhraseSuggester.Collate collate, PhraseSuggestionBuilder phraseSuggestionBuilder) { if ((collate != null) && (queryTranslator != null)) { QueryBuilder queryBuilder = queryTranslator.translate( collate.getQuery(), null); phraseSuggestionBuilder.collateParams(collate.getParams()); if (collate.isPrune() != null) { phraseSuggestionBuilder.collatePrune(collate.isPrune()); } phraseSuggestionBuilder.collateQuery(queryBuilder.toString()); } } protected void translate( Set<PhraseSuggester.CandidateGenerator> candidateGenerators, PhraseSuggestionBuilder phraseSuggestionBuilder) { for (PhraseSuggester.CandidateGenerator candidateGenerator : candidateGenerators) { PhraseSuggestionBuilder.DirectCandidateGenerator directCandidateGenerator = new PhraseSuggestionBuilder.DirectCandidateGenerator( candidateGenerator.getField()); if (candidateGenerator.getAccuracy() != null) { directCandidateGenerator.accuracy( candidateGenerator.getAccuracy()); } if (candidateGenerator.getMaxEdits() != null) { directCandidateGenerator.maxEdits( candidateGenerator.getMaxEdits()); } if (candidateGenerator.getMaxInspections() != null) { directCandidateGenerator.maxInspections( candidateGenerator.getMaxInspections()); } if (candidateGenerator.getMaxTermFreq() != null) { directCandidateGenerator.maxTermFreq( candidateGenerator.getMaxTermFreq()); } if (candidateGenerator.getMinWordLength() != null) { directCandidateGenerator.minWordLength( candidateGenerator.getMinWordLength()); } if (candidateGenerator.getMinDocFreq() != null) { directCandidateGenerator.minDocFreq( candidateGenerator.getMinDocFreq()); } if (candidateGenerator.getPrefixLength() != null) { directCandidateGenerator.prefixLength( candidateGenerator.getPrefixLength()); } if (Validator.isNotNull( candidateGenerator.getPostFilterAnalyzer())) { directCandidateGenerator.postFilter( candidateGenerator.getPostFilterAnalyzer()); } if (Validator.isNotNull( candidateGenerator.getPreFilterAnalyzer())) { directCandidateGenerator.preFilter( candidateGenerator.getPreFilterAnalyzer()); } if (candidateGenerator.getSize() != null) { directCandidateGenerator.size(candidateGenerator.getSize()); } if (candidateGenerator.getSort() != null) { directCandidateGenerator.sort( translate(candidateGenerator.getSort())); } if (candidateGenerator.getStringDistance() != null) { directCandidateGenerator.stringDistance( translate(candidateGenerator.getStringDistance())); } if (candidateGenerator.getSuggestMode() != null) { directCandidateGenerator.suggestMode( translate(candidateGenerator.getSuggestMode())); } phraseSuggestionBuilder.addCandidateGenerator( directCandidateGenerator); } } @Reference( cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY, target = "(search.engine.impl=Elasticsearch)" ) protected volatile QueryTranslator<QueryBuilder> queryTranslator; }