diff --git a/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/glossary_term_search_index_mapping.py b/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/glossary_term_search_index_mapping.py index 5fddec6a518..e5a11283d31 100644 --- a/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/glossary_term_search_index_mapping.py +++ b/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/glossary_term_search_index_mapping.py @@ -22,7 +22,7 @@ GLOSSARY_TERM_ELASTICSEARCH_INDEX_MAPPING = textwrap.dedent( "type": "text" }, "name": { - "type": "text", + "type": "keyword", "fields": { "keyword": { "type": "keyword", diff --git a/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/table_search_index_mapping.py b/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/table_search_index_mapping.py index f8574de2322..cf5cf57c4a3 100644 --- a/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/table_search_index_mapping.py +++ b/ingestion/src/metadata/ingestion/sink/elasticsearch_mapping/table_search_index_mapping.py @@ -89,6 +89,7 @@ TABLE_ELASTICSEARCH_INDEX_MAPPING = textwrap.dedent( "properties": { "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", @@ -151,6 +152,7 @@ TABLE_ELASTICSEARCH_INDEX_MAPPING = textwrap.dedent( }, "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", @@ -188,6 +190,7 @@ TABLE_ELASTICSEARCH_INDEX_MAPPING = textwrap.dedent( }, "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/search/SearchResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/search/SearchResource.java index 908871bf7c1..abbc4947bcf 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/search/SearchResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/search/SearchResource.java @@ -60,6 +60,7 @@ import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.search.SearchModule; import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.BucketOrder; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; @@ -353,6 +354,42 @@ public class SearchResource { return Response.status(OK).entity(suggest.toString()).build(); } + @GET + @Path("/aggregate") + @Operation( + operationId = "getAggregateFields", + summary = "Get Aggregated Fields", + tags = "search", + description = "Get Aggregated Fields from Entities.", + responses = { + @ApiResponse( + responseCode = "200", + description = "Table Aggregate API", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = Suggest.class))) + }) + public Response aggregate( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @DefaultValue("table_search_index") @QueryParam("index") String index, + @Parameter(description = "Field in an entity.") @QueryParam("field") String fieldName, + @Parameter(description = "Size field to limit the no.of results returned, defaults to 10") + @DefaultValue("10") + @QueryParam("size") + int size, + @DefaultValue("false") @QueryParam("deleted") String deleted) + throws IOException { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder + .aggregation( + AggregationBuilders.terms(fieldName).field(fieldName).size(MAX_AGGREGATE_SIZE).order(BucketOrder.key(true))) + .size(0); + searchSourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS)); + String response = + client.search(new SearchRequest(index).source(searchSourceBuilder), RequestOptions.DEFAULT).toString(); + return Response.status(OK).entity(response).build(); + } + private SearchSourceBuilder buildAggregateSearchBuilder(String query, int from, int size) { QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(query).lenient(true); SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, null, from, size); diff --git a/openmetadata-service/src/main/resources/elasticsearch/glossary_index_mapping.json b/openmetadata-service/src/main/resources/elasticsearch/glossary_index_mapping.json index a5a532583f0..c454244170e 100644 --- a/openmetadata-service/src/main/resources/elasticsearch/glossary_index_mapping.json +++ b/openmetadata-service/src/main/resources/elasticsearch/glossary_index_mapping.json @@ -33,7 +33,7 @@ "type": "text" }, "name": { - "type": "text", + "type": "keyword", "fields": { "keyword": { "type": "keyword", diff --git a/openmetadata-service/src/main/resources/elasticsearch/table_index_mapping.json b/openmetadata-service/src/main/resources/elasticsearch/table_index_mapping.json index e62eb672d8a..257c1db234b 100644 --- a/openmetadata-service/src/main/resources/elasticsearch/table_index_mapping.json +++ b/openmetadata-service/src/main/resources/elasticsearch/table_index_mapping.json @@ -72,6 +72,7 @@ "properties": { "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", @@ -134,6 +135,7 @@ }, "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", @@ -171,6 +173,7 @@ }, "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", @@ -245,6 +248,7 @@ }, "name": { "type": "keyword", + "normalizer": "lowercase_normalizer", "fields": { "keyword": { "type": "keyword", diff --git a/openmetadata-service/src/main/resources/elasticsearch/tag_index_mapping.json b/openmetadata-service/src/main/resources/elasticsearch/tag_index_mapping.json index f8e76c6ba0f..0c6678a631d 100644 --- a/openmetadata-service/src/main/resources/elasticsearch/tag_index_mapping.json +++ b/openmetadata-service/src/main/resources/elasticsearch/tag_index_mapping.json @@ -33,7 +33,7 @@ "type": "text" }, "name": { - "type": "text", + "type": "keyword", "fields": { "keyword": { "type": "keyword",