diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchSourceBuilderFactory.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchSourceBuilderFactory.java index a8ea40acd1a..2d1b189f383 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchSourceBuilderFactory.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchSourceBuilderFactory.java @@ -8,6 +8,7 @@ import static org.openmetadata.service.search.SearchUtil.isTimeSeriesIndex; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import org.openmetadata.schema.api.search.AssetTypeConfiguration; import org.openmetadata.schema.api.search.SearchSettings; import org.openmetadata.service.Entity; @@ -23,6 +24,23 @@ import org.openmetadata.service.Entity; */ public interface SearchSourceBuilderFactory { + Pattern QUERY_SYNTAX_PATTERN = + Pattern.compile( + "\\w+\\s*:\\s*\\w+|" + + // Field queries (field:value) + "\\b(?i)(?:AND|OR|NOT)\\b|" + + // Boolean operators + "[*?]|" + + // Wildcards + "[()]|" + + // Parentheses + "\"|" + + // Quotes + "\\[.+\\s+TO\\s+.+\\]|" + + // Range queries + "[+\\-~\\^]" // Special operators + ); + /** * Get the appropriate search source builder based on the index name. * @@ -207,4 +225,12 @@ public interface SearchSourceBuilderFactory { S searchBuilder(Q queryBuilder, H highlightBuilder, int from, int size); S addAggregationsToNLQQuery(S searchSourceBuilder, String indexName); + + default boolean containsQuerySyntax(String query) { + if (query == null || query.isEmpty()) { + return false; + } + query = query.replace("%20", " ").trim(); + return QUERY_SYNTAX_PATTERN.matcher(query).find(); + } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchSourceBuilderFactory.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchSourceBuilderFactory.java index 625bbe70769..de8bcd9f61d 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchSourceBuilderFactory.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchSourceBuilderFactory.java @@ -153,6 +153,17 @@ public class ElasticSearchSourceBuilderFactory if (query == null || query.trim().isEmpty() || query.trim().equals("*")) { baseQuery.must(QueryBuilders.matchAllQuery()); + } else if (containsQuerySyntax(query)) { + QueryStringQueryBuilder queryStringBuilder = + QueryBuilders.queryStringQuery(query) + .fields(fields) + .defaultOperator(Operator.AND) + .type(MultiMatchQueryBuilder.Type.MOST_FIELDS) + .fuzziness(Fuzziness.AUTO) + .fuzzyPrefixLength(1) + .tieBreaker(0.3f); + + baseQuery.must(queryStringBuilder); } else { MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(query) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchSourceBuilderFactory.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchSourceBuilderFactory.java index 429eaf3beb8..2c8ed67c4a8 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchSourceBuilderFactory.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchSourceBuilderFactory.java @@ -3,6 +3,7 @@ package org.openmetadata.service.search.opensearch; import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; import static org.openmetadata.service.search.EntityBuilderConstant.POST_TAG; import static org.openmetadata.service.search.EntityBuilderConstant.PRE_TAG; +import static os.org.opensearch.index.query.MultiMatchQueryBuilder.Type.MOST_FIELDS; import java.util.ArrayList; import java.util.HashMap; @@ -47,7 +48,7 @@ public class OpenSearchSourceBuilderFactory public QueryStringQueryBuilder buildSearchQueryBuilder(String query, Map fields) { return QueryBuilders.queryStringQuery(query) .fields(fields) - .type(MultiMatchQueryBuilder.Type.MOST_FIELDS) + .type(MOST_FIELDS) .defaultOperator(Operator.AND) .fuzziness(Fuzziness.AUTO) .fuzzyPrefixLength(3) @@ -152,6 +153,17 @@ public class OpenSearchSourceBuilderFactory BoolQueryBuilder baseQuery = QueryBuilders.boolQuery(); if (query == null || query.trim().isEmpty() || query.trim().equals("*")) { baseQuery.must(QueryBuilders.matchAllQuery()); + } else if (containsQuerySyntax(query)) { + QueryStringQueryBuilder queryStringBuilder = + QueryBuilders.queryStringQuery(query) + .fields(fields) + .defaultOperator(Operator.AND) + .type(MultiMatchQueryBuilder.Type.MOST_FIELDS) + .fuzziness(Fuzziness.AUTO) + .fuzzyPrefixLength(1) + .tieBreaker(0.3f); + + baseQuery.must(queryStringBuilder); } else { MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(query) diff --git a/openmetadata-service/src/main/resources/json/data/searchSettings/searchSettings.json b/openmetadata-service/src/main/resources/json/data/searchSettings/searchSettings.json index 15e3b73b68e..10cc8e0a945 100644 --- a/openmetadata-service/src/main/resources/json/data/searchSettings/searchSettings.json +++ b/openmetadata-service/src/main/resources/json/data/searchSettings/searchSettings.json @@ -56,12 +56,12 @@ "field": "databaseSchema.name.keyword" }, { - "name": "database.displayName.keyword", + "name": "database.displayName", "type": "terms", "field": "database.displayName.keyword" }, { - "name": "databaseSchema.displayName.keyword", + "name": "databaseSchema.displayName", "type": "terms", "field": "databaseSchema.displayName.keyword" }