/**
* 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.query;
import com.liferay.portal.kernel.search.generic.MultiMatchQuery;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.search.elasticsearch.query.MultiMatchQueryTranslator;
import java.util.Map;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.osgi.service.component.annotations.Component;
/**
* @author Michael C. Han
*/
@Component(immediate = true, service = MultiMatchQueryTranslator.class)
public class MultiMatchQueryTranslatorImpl
extends BaseMatchQueryTranslatorImpl implements MultiMatchQueryTranslator {
@Override
public QueryBuilder translate(MultiMatchQuery multiMatchQuery) {
MultiMatchQueryBuilder multiMatchQueryBuilder =
QueryBuilders.multiMatchQuery(
multiMatchQuery.getValue(), StringPool.EMPTY_ARRAY);
if (Validator.isNotNull(multiMatchQuery.getAnalyzer())) {
multiMatchQueryBuilder.analyzer(multiMatchQuery.getAnalyzer());
}
if (multiMatchQuery.getCutOffFrequency() != null) {
multiMatchQueryBuilder.cutoffFrequency(
multiMatchQuery.getCutOffFrequency());
}
Map<String, Float> fieldBoosts = multiMatchQuery.getFieldsBoosts();
for (String field : multiMatchQuery.getFields()) {
Float fieldBoost = null;
if (fieldBoosts != null) {
fieldBoost = fieldBoosts.get(field);
}
if (fieldBoost != null) {
multiMatchQueryBuilder.field(field, fieldBoost);
}
else {
multiMatchQueryBuilder.field(field);
}
}
if (multiMatchQuery.getFuzziness() != null) {
multiMatchQueryBuilder.fuzziness(
Fuzziness.build(multiMatchQuery.getFuzziness()));
}
if (multiMatchQuery.getFuzzyRewriteMethod() != null) {
String multiMatchQueryFuzzyRewriteMethod = translate(
multiMatchQuery.getFuzzyRewriteMethod());
multiMatchQueryBuilder.fuzzyRewrite(
multiMatchQueryFuzzyRewriteMethod);
}
if (multiMatchQuery.getMaxExpansions() != null) {
multiMatchQueryBuilder.maxExpansions(
multiMatchQuery.getMaxExpansions());
}
if (Validator.isNotNull(multiMatchQuery.getMinShouldMatch())) {
multiMatchQueryBuilder.minimumShouldMatch(
multiMatchQuery.getMinShouldMatch());
}
if (multiMatchQuery.getOperator() != null) {
MatchQueryBuilder.Operator matchQueryBuilderOperator = translate(
multiMatchQuery.getOperator());
multiMatchQueryBuilder.operator(matchQueryBuilderOperator);
}
if (multiMatchQuery.getPrefixLength() != null) {
multiMatchQueryBuilder.prefixLength(
multiMatchQuery.getPrefixLength());
}
if (multiMatchQuery.getSlop() != null) {
multiMatchQueryBuilder.slop(multiMatchQuery.getSlop());
}
if (multiMatchQuery.getType() != null) {
MultiMatchQueryBuilder.Type multiMatchQueryBuilderType = translate(
multiMatchQuery.getType());
multiMatchQueryBuilder.type(multiMatchQueryBuilderType);
}
if (multiMatchQuery.getZeroTermsQuery() != null) {
MatchQueryBuilder.ZeroTermsQuery
multiMatchQueryBuilderZeroTermsQuery = translate(
multiMatchQuery.getZeroTermsQuery());
multiMatchQueryBuilder.zeroTermsQuery(
multiMatchQueryBuilderZeroTermsQuery);
}
if (!multiMatchQuery.isDefaultBoost()) {
multiMatchQueryBuilder.boost(multiMatchQuery.getBoost());
}
if (multiMatchQuery.isLenient() != null) {
multiMatchQueryBuilder.lenient(multiMatchQuery.isLenient());
}
return multiMatchQueryBuilder;
}
protected MultiMatchQueryBuilder.Type translate(
MultiMatchQuery.Type multiMatchQueryType) {
if (multiMatchQueryType == MultiMatchQuery.Type.BEST_FIELDS) {
return MultiMatchQueryBuilder.Type.BEST_FIELDS;
}
else if (multiMatchQueryType == MultiMatchQuery.Type.CROSS_FIELDS) {
return MultiMatchQueryBuilder.Type.CROSS_FIELDS;
}
else if (multiMatchQueryType == MultiMatchQuery.Type.MOST_FIELDS) {
return MultiMatchQueryBuilder.Type.MOST_FIELDS;
}
else if (multiMatchQueryType == MultiMatchQuery.Type.PHRASE) {
return MultiMatchQueryBuilder.Type.PHRASE;
}
else if (multiMatchQueryType == MultiMatchQuery.Type.PHRASE_PREFIX) {
return MultiMatchQueryBuilder.Type.PHRASE_PREFIX;
}
throw new IllegalArgumentException(
"Invalid multi match query type: " + multiMatchQueryType);
}
}