diff --git a/solidify-index/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java b/solidify-index/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java index f9e4a621038cfaeaa6fb102e64deb3ab1d62d7d1..bcf5ab7cd58e588f4b0c13f3619072698df9d369 100644 --- a/solidify-index/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java +++ b/solidify-index/src/main/java/ch/unige/solidify/index/indexing/elasticsearch/ElasticsearchService.java @@ -45,6 +45,9 @@ import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.index.query.AbstractQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.MultiMatchQueryBuilder; +import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryStringQueryBuilder; @@ -351,11 +354,19 @@ public abstract class ElasticsearchService<T extends IndexMetadata> extends Inde private QueryBuilder getMatchQueryBuilder(SearchCondition condition) { if (!StringTool.isNullOrEmpty(condition.getField()) && !StringTool.isNullOrEmpty(condition.getValue())) { // 'match' query - return QueryBuilders.matchQuery(condition.getField(), condition.getValue()); + MatchQueryBuilder builder = QueryBuilders.matchQuery(condition.getField(), condition.getValue()); + if (condition.getSearchOperator() != null) { + builder.operator(Operator.fromString(condition.getSearchOperator().name())); + } + return builder; } else if (!condition.getMultiMatchFields().isEmpty() && !StringTool.isNullOrEmpty(condition.getValue())) { // 'multi_match' query - return QueryBuilders.multiMatchQuery(condition.getValue(), + MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery(condition.getValue(), condition.getMultiMatchFields().toArray(new String[condition.getMultiMatchFields().size()])); + if (condition.getSearchOperator() != null) { + builder.operator(Operator.fromString(condition.getSearchOperator().name())); + } + return builder; } else { throw new SolidifyRuntimeException("Invalid 'match' search condition"); } diff --git a/solidify-model/src/main/java/ch/unige/solidify/rest/SearchCondition.java b/solidify-model/src/main/java/ch/unige/solidify/rest/SearchCondition.java index d5c07b8cc5c22353a8c4b86ae9f3cb7ab5b3ba8d..3f70c40d042260cf679db8bbd1f21a9737239023 100644 --- a/solidify-model/src/main/java/ch/unige/solidify/rest/SearchCondition.java +++ b/solidify-model/src/main/java/ch/unige/solidify/rest/SearchCondition.java @@ -36,6 +36,8 @@ public class SearchCondition implements Serializable { */ private SearchConditionType type = SearchConditionType.MATCH; + private SearchOperator searchOperator = null; + /** * Indicate whether the condition is used to find documents that must, must not or should contain its value */ @@ -162,4 +164,12 @@ public class SearchCondition implements Serializable { public void setLowerValue(String lowerValue) { this.lowerValue = lowerValue; } + + public SearchOperator getSearchOperator() { + return this.searchOperator; + } + + public void setSearchOperator(SearchOperator searchOperator) { + this.searchOperator = searchOperator; + } } diff --git a/solidify-model/src/main/java/ch/unige/solidify/rest/SearchOperator.java b/solidify-model/src/main/java/ch/unige/solidify/rest/SearchOperator.java new file mode 100644 index 0000000000000000000000000000000000000000..b5192e46357a76031b7e4db55d3b8d69780b5071 --- /dev/null +++ b/solidify-model/src/main/java/ch/unige/solidify/rest/SearchOperator.java @@ -0,0 +1,27 @@ +/*- + * %%---------------------------------------------------------------------------------------------- + * Solidify Framework - Solidify Model - SearchOperator.java + * SPDX-License-Identifier: GPL-2.0-or-later + * %----------------------------------------------------------------------------------------------% + * Copyright (C) 2017 - 2022 University of Geneva + * %----------------------------------------------------------------------------------------------% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-2.0.html>. + * ----------------------------------------------------------------------------------------------%% + */ +package ch.unige.solidify.rest; + +public enum SearchOperator { + AND, OR +}