Improve Search Relevancy

This commit is contained in:
Sriharsha Chintalapani 2024-09-19 09:05:09 -07:00
parent eda9ecc83f
commit f0c86fda53
52 changed files with 794 additions and 457 deletions

View File

@ -171,7 +171,13 @@ public class SearchResource {
"Fetch search results in hierarchical order of children elements. By default hierarchy is not fetched. Currently only supported for glossary_term_search_index.")
@DefaultValue("false")
@QueryParam("getHierarchy")
boolean getHierarchy)
boolean getHierarchy,
@Parameter(
description =
"Explain the results of the query. Defaults to false. Only for debugging purposes.")
@DefaultValue("false")
@QueryParam("explain")
boolean explain)
throws IOException {
if (nullOrEmpty(query)) {
@ -202,6 +208,7 @@ public class SearchResource {
.applyDomainFilter(
!subjectContext.isAdmin() && subjectContext.hasAnyRole(DOMAIN_ONLY_ACCESS_ROLE))
.searchAfter(searchAfter)
.explain(explain)
.build();
return searchRepository.search(request);
}

View File

@ -9,6 +9,9 @@ public class EntityBuilderConstant {
public static final String ES_MESSAGE_SCHEMA_FIELD = "messageSchema.schemaFields.name";
public static final String ES_MESSAGE_SCHEMA_FIELD_KEYWORD =
"messageSchema.schemaFields.name.keyword";
public static final String API_RESPONSE_SCHEMA_FIELD = "responseSchema.schemaFields.name";
public static final String API_RESPONSE_SCHEMA_FIELD_KEYWORD =
"responseSchema.schemaFields.name.keyword";
public static final String ES_TAG_FQN_FIELD = "tags.tagFQN";
public static final String COLUMNS_NAME_KEYWORD = "columns.name.keyword";

View File

@ -29,6 +29,7 @@ public class SearchRequest {
private final List<String> domains;
private final boolean getHierarchy;
private final Object[] searchAfter;
private final boolean explain;
public SearchRequest(ElasticSearchRequestBuilder builder) {
this.query = builder.query;
@ -48,6 +49,7 @@ public class SearchRequest {
this.domains = builder.domains;
this.applyDomainFilter = builder.applyDomainFilter;
this.searchAfter = builder.searchAfter;
this.explain = builder.explain;
}
// Builder class for ElasticSearchRequest
@ -70,6 +72,7 @@ public class SearchRequest {
private boolean applyDomainFilter;
private List<String> domains;
private Object[] searchAfter;
private boolean explain;
public ElasticSearchRequestBuilder(String query, int size, String index) {
this.query = query;
@ -153,6 +156,11 @@ public class SearchRequest {
return this;
}
public ElasticSearchRequestBuilder explain(boolean explain) {
this.explain = explain;
return this;
}
public SearchRequest build() {
return new SearchRequest(this);
}

View File

@ -13,6 +13,8 @@ import static org.openmetadata.service.Entity.GLOSSARY_TERM;
import static org.openmetadata.service.Entity.QUERY;
import static org.openmetadata.service.Entity.RAW_COST_ANALYSIS_REPORT_DATA;
import static org.openmetadata.service.exception.CatalogGenericExceptionMapper.getResponse;
import static org.openmetadata.service.search.EntityBuilderConstant.API_RESPONSE_SCHEMA_FIELD;
import static org.openmetadata.service.search.EntityBuilderConstant.API_RESPONSE_SCHEMA_FIELD_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.COLUMNS_NAME_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.DATA_MODEL_COLUMNS_NAME_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.DOMAIN_DISPLAY_NAME_KEYWORD;
@ -173,6 +175,7 @@ import org.openmetadata.service.search.elasticsearch.dataInsightAggregators.Elas
import org.openmetadata.service.search.elasticsearch.dataInsightAggregators.ElasticSearchMostViewedEntitiesAggregator;
import org.openmetadata.service.search.elasticsearch.dataInsightAggregators.ElasticSearchPageViewsByEntitiesAggregator;
import org.openmetadata.service.search.elasticsearch.dataInsightAggregators.ElasticSearchUnusedAssetsAggregator;
import org.openmetadata.service.search.indexes.APIEndpointIndex;
import org.openmetadata.service.search.indexes.ContainerIndex;
import org.openmetadata.service.search.indexes.DashboardDataModelIndex;
import org.openmetadata.service.search.indexes.DashboardIndex;
@ -1126,42 +1129,28 @@ public class ElasticSearchClient implements SearchClient {
return jsonResponse.getJsonObject("aggregations");
}
private static FunctionScoreQueryBuilder boostScore(
QueryStringQueryBuilder queryBuilder, String query) {
FunctionScoreQueryBuilder.FilterFunctionBuilder displayNameBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.existsQuery("displayName.keyword"), // If displayName exists
ScoreFunctionBuilders.weightFactorFunction(10.0f)); // Give it a high weight
FunctionScoreQueryBuilder.FilterFunctionBuilder nameBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.boolQuery()
.mustNot(
QueryBuilders.existsQuery(
"displayName.keyword")) // Only use name if displayName doesn't exist
.must(QueryBuilders.matchQuery("name.keyword", query)),
ScoreFunctionBuilders.weightFactorFunction(8.0f)); //
private static FunctionScoreQueryBuilder boostScore(QueryStringQueryBuilder queryBuilder) {
FunctionScoreQueryBuilder.FilterFunctionBuilder tier1Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier.Tier1"),
ScoreFunctionBuilders.weightFactorFunction(5.0f));
ScoreFunctionBuilders.weightFactorFunction(50.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder tier2Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier.Tier2"),
ScoreFunctionBuilders.weightFactorFunction(3.0f));
ScoreFunctionBuilders.weightFactorFunction(30.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder tier3Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier.Tier3"),
ScoreFunctionBuilders.weightFactorFunction(1.0f));
ScoreFunctionBuilders.weightFactorFunction(15.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder weeklyStatsBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.rangeQuery("usageSummary.weeklyStats.count").gt(0),
ScoreFunctionBuilders.fieldValueFactorFunction("usageSummary.weeklyStats.count")
.factor(1.5f)
.factor(4.0f)
.modifier(FieldValueFactorFunction.Modifier.SQRT)
.missing(1));
@ -1169,7 +1158,7 @@ public class ElasticSearchClient implements SearchClient {
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.rangeQuery("totalVotes").gt(0),
ScoreFunctionBuilders.fieldValueFactorFunction("totalVotes")
.factor(2.0f)
.factor(3.0f)
.modifier(FieldValueFactorFunction.Modifier.LN1P)
.missing(0));
@ -1177,16 +1166,10 @@ public class ElasticSearchClient implements SearchClient {
return QueryBuilders.functionScoreQuery(
queryBuilder,
new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {
displayNameBoost,
nameBoost,
tier1Boost,
tier2Boost,
tier3Boost,
weeklyStatsBoost,
totalVotesBoost
tier1Boost, tier2Boost, tier3Boost, weeklyStatsBoost, totalVotesBoost
})
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.boostMode(CombineFunction.SUM);
.boostMode(CombineFunction.MULTIPLY);
}
private static HighlightBuilder buildHighlights(List<String> fields) {
@ -1249,7 +1232,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildPipelineSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, PipelineIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("tasks.name", "tasks.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder.aggregation(
@ -1260,7 +1243,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildMlModelSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, MlModelIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("mlFeatures.name", "mlFeatures.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
return addAggregation(searchSourceBuilder);
@ -1269,7 +1252,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildTopicSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TopicIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder
@ -1283,7 +1266,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildDashboardSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DashboardIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("charts.name", "charts.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder
@ -1301,7 +1284,7 @@ public class ElasticSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchIndex.getAllFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, null, from, size);
searchSourceBuilder.aggregation(
AggregationBuilders.terms("database.name.keyword")
@ -1318,7 +1301,7 @@ public class ElasticSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchIndex.getDefaultFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
return addAggregation(searchSourceBuilder);
@ -1327,7 +1310,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildTableSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TableIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb =
buildHighlights(List.of("columns.name", "columns.description", "columns.children.name"));
SearchSourceBuilder searchSourceBuilder =
@ -1355,7 +1338,7 @@ public class ElasticSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, GlossaryTermIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("synonyms"));
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1370,7 +1353,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildTagSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TagIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1383,7 +1366,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildContainerSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, ContainerIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb =
buildHighlights(
List.of(
@ -1403,7 +1386,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildQuerySearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, QueryIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
return searchBuilder(queryBuilder, hb, from, size);
}
@ -1418,7 +1401,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildStoredProcedureSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, StoredProcedureIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
queryBuilder.boostMode(CombineFunction.SUM);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
@ -1430,7 +1413,7 @@ public class ElasticSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DashboardDataModelIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1442,10 +1425,24 @@ public class ElasticSearchClient implements SearchClient {
return addAggregation(searchSourceBuilder);
}
private static SearchSourceBuilder buildApiEndpointSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, APIEndpointIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder
.aggregation(
AggregationBuilders.terms(API_RESPONSE_SCHEMA_FIELD)
.field(API_RESPONSE_SCHEMA_FIELD_KEYWORD))
.aggregation(AggregationBuilders.terms(SCHEMA_FIELD_NAMES).field(SCHEMA_FIELD_NAMES));
return addAggregation(searchSourceBuilder);
}
private static SearchSourceBuilder buildDomainsSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DomainIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
return searchBuilder(queryBuilder, hb, from, size);
}
@ -1459,7 +1456,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildSearchEntitySearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchEntityIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1486,7 +1483,7 @@ public class ElasticSearchClient implements SearchClient {
private static SearchSourceBuilder buildDataProductSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DataProductIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
queryBuilder.boostMode(CombineFunction.SUM);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
@ -2073,10 +2070,6 @@ public class ElasticSearchClient implements SearchClient {
.calendarInterval(DateHistogramInterval.DAY);
TermsAggregationBuilder termsAggregationBuilder;
SumAggregationBuilder sumAggregationBuilder;
SumAggregationBuilder sumEntityCountAggregationBuilder =
AggregationBuilders.sum(DataInsightChartRepository.ENTITY_COUNT)
.field(DataInsightChartRepository.DATA_ENTITY_COUNT);
switch (dataInsightChartName) {
case AGGREGATED_UNUSED_ASSETS_SIZE, AGGREGATED_UNUSED_ASSETS_COUNT:
@ -2277,7 +2270,9 @@ public class ElasticSearchClient implements SearchClient {
case "data_product_search_index" -> buildDataProductSearch(q, from, size);
case "test_case_resolution_status_search_index" -> buildTestCaseResolutionStatusSearch(
q, from, size);
case "mlmodel_service_search_index",
case "api_endpoint_search_index", "apiEndpoint" -> buildApiEndpointSearch(q, from, size);
case "api_service_search_index",
"mlmodel_service_search_index",
"database_service_search_index",
"messaging_service_index",
"dashboard_service_index",

View File

@ -57,9 +57,6 @@ public record ContainerIndex(Container container) implements ColumnIndex {
Map<String, Object> commonAttributes = getCommonAttributesMap(container, Entity.CONTAINER);
doc.putAll(commonAttributes);
doc.put(
"displayName",
container.getDisplayName() != null ? container.getDisplayName() : container.getName());
doc.put("tags", flattenedTagList);
doc.put("tier", parseTags.getTierTag());
doc.put("service_suggest", serviceSuggest);

View File

@ -48,10 +48,6 @@ public class DashboardIndex implements SearchIndex {
}
Map<String, Object> commonAttributes = getCommonAttributesMap(dashboard, Entity.DASHBOARD);
doc.putAll(commonAttributes);
doc.put(
"displayName",
dashboard.getDisplayName() != null ? dashboard.getDisplayName() : dashboard.getName());
doc.put("tags", parseTags.getTags());
doc.put("tier", parseTags.getTierTag());
doc.put("chart_suggest", chartSuggest);

View File

@ -60,11 +60,6 @@ public class IngestionPipelineIndex implements SearchIndex {
ingestionPipeline.getName() != null
? ingestionPipeline.getName()
: ingestionPipeline.getDisplayName());
doc.put(
"displayName",
ingestionPipeline.getDisplayName() != null
? ingestionPipeline.getDisplayName()
: ingestionPipeline.getName());
doc.put("tags", parseTags.getTags());
doc.put("tier", parseTags.getTierTag());
doc.put("service_suggest", serviceSuggest);

View File

@ -32,9 +32,6 @@ public class MlModelIndex implements SearchIndex {
ParseTags parseTags = new ParseTags(Entity.getEntityTags(Entity.MLMODEL, mlModel));
Map<String, Object> commonAttributes = getCommonAttributesMap(mlModel, Entity.MLMODEL);
doc.putAll(commonAttributes);
doc.put(
"displayName",
mlModel.getDisplayName() != null ? mlModel.getDisplayName() : mlModel.getName());
doc.put("tags", parseTags.getTags());
doc.put("tier", parseTags.getTierTag());
doc.put("serviceType", mlModel.getServiceType());

View File

@ -46,9 +46,6 @@ public class PipelineIndex implements SearchIndex {
Map<String, Object> commonAttributes = getCommonAttributesMap(pipeline, Entity.PIPELINE);
doc.putAll(commonAttributes);
doc.put("name", pipeline.getName() != null ? pipeline.getName() : pipeline.getDisplayName());
doc.put(
"displayName",
pipeline.getDisplayName() != null ? pipeline.getDisplayName() : pipeline.getName());
doc.put("tags", parseTags.getTags());
doc.put("tier", parseTags.getTierTag());
doc.put("task_suggest", taskSuggest);

View File

@ -36,7 +36,6 @@ public class QueryIndex implements SearchIndex {
ParseTags parseTags = new ParseTags(Entity.getEntityTags(Entity.QUERY, query));
Map<String, Object> commonAttributes = getCommonAttributesMap(query, Entity.QUERY);
doc.putAll(commonAttributes);
doc.put("displayName", query.getDisplayName() != null ? query.getDisplayName() : "");
doc.put("tags", parseTags.getTags());
doc.put("tier", parseTags.getTierTag());
return doc;

View File

@ -3,14 +3,11 @@ package org.openmetadata.service.search.indexes;
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
import static org.openmetadata.service.Entity.FIELD_DESCRIPTION;
import static org.openmetadata.service.Entity.FIELD_DISPLAY_NAME;
import static org.openmetadata.service.Entity.FIELD_NAME;
import static org.openmetadata.service.jdbi3.LineageRepository.buildRelationshipDetailsMap;
import static org.openmetadata.service.search.EntityBuilderConstant.DISPLAY_NAME_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.FIELD_DISPLAY_NAME_NGRAM;
import static org.openmetadata.service.search.EntityBuilderConstant.FIELD_NAME_NGRAM;
import static org.openmetadata.service.search.EntityBuilderConstant.FULLY_QUALIFIED_NAME;
import static org.openmetadata.service.search.EntityBuilderConstant.FULLY_QUALIFIED_NAME_PARTS;
import static org.openmetadata.service.search.EntityBuilderConstant.NAME_KEYWORD;
import java.util.ArrayList;
import java.util.Collections;
@ -68,6 +65,9 @@ public interface SearchIndex {
default Map<String, Object> getCommonAttributesMap(EntityInterface entity, String entityType) {
Map<String, Object> map = new HashMap<>();
List<SearchSuggest> suggest = getSuggest();
map.put(
"displayName",
entity.getDisplayName() != null ? entity.getDisplayName() : entity.getName());
map.put("entityType", entityType);
map.put("owners", getEntitiesWithDisplayName(entity.getOwners()));
map.put("domain", getEntityWithDisplayName(entity.getDomain()));
@ -163,12 +163,9 @@ public interface SearchIndex {
static Map<String, Float> getDefaultFields() {
Map<String, Float> fields = new HashMap<>();
fields.put(FIELD_DISPLAY_NAME, 10.0f);
fields.put(DISPLAY_NAME_KEYWORD, 10.0f);
fields.put(FIELD_DISPLAY_NAME_NGRAM, 1.0f);
fields.put(FIELD_NAME, 10.0f);
fields.put(FIELD_NAME_NGRAM, 1.0f);
fields.put(DISPLAY_NAME_KEYWORD, 8.0f);
fields.put(NAME_KEYWORD, 8.0f);
fields.put(FIELD_DISPLAY_NAME, 10.0f);
fields.put(FIELD_DESCRIPTION, 2.0f);
fields.put(FULLY_QUALIFIED_NAME, 5.0f);
fields.put(FULLY_QUALIFIED_NAME_PARTS, 5.0f);
@ -178,6 +175,7 @@ public interface SearchIndex {
static Map<String, Float> getAllFields() {
Map<String, Float> fields = getDefaultFields();
fields.putAll(TableIndex.getFields());
fields.putAll(StoredProcedureIndex.getFields());
fields.putAll(DashboardIndex.getFields());
fields.putAll(DashboardDataModelIndex.getFields());
fields.putAll(PipelineIndex.getFields());

View File

@ -91,8 +91,6 @@ public record TableIndex(Table table) implements ColumnIndex {
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Map<String, Object> commonAttributes = getCommonAttributesMap(table, Entity.TABLE);
doc.putAll(commonAttributes);
doc.put(
"displayName", table.getDisplayName() != null ? table.getDisplayName() : table.getName());
doc.put("tags", flattenedTagList);
doc.put("tier", parseTags.getTierTag());
doc.put("service_suggest", serviceSuggest);
@ -113,7 +111,7 @@ public record TableIndex(Table table) implements ColumnIndex {
fields.put("columns.name", 5.0f);
fields.put("columns.displayName", 5.0f);
fields.put("columns.description", 2.0f);
fields.put("columns.children.name", 5.0f);
fields.put("columns.children.name", 3.0f);
return fields;
}
}

View File

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openmetadata.common.utils.CommonUtil;
import org.openmetadata.schema.entity.teams.Team;
import org.openmetadata.service.Entity;
import org.openmetadata.service.search.models.SearchSuggest;
@ -39,9 +38,6 @@ public class TeamIndex implements SearchIndex {
Map<String, Object> commonAttributes = getCommonAttributesMap(team, Entity.TEAM);
doc.putAll(commonAttributes);
doc.put("isBot", false);
doc.put(
"displayName",
CommonUtil.nullOrEmpty(team.getDisplayName()) ? team.getName() : team.getDisplayName());
return doc;
}
}

View File

@ -76,8 +76,6 @@ public class TopicIndex implements SearchIndex {
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Map<String, Object> commonAttributes = getCommonAttributesMap(topic, Entity.TOPIC);
doc.putAll(commonAttributes);
doc.put(
"displayName", topic.getDisplayName() != null ? topic.getDisplayName() : topic.getName());
doc.put("tags", flattenedTagList);
doc.put("tier", parseTags.getTierTag());
doc.put("field_suggest", fieldSuggest);

View File

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openmetadata.common.utils.CommonUtil;
import org.openmetadata.schema.entity.teams.User;
import org.openmetadata.service.Entity;
import org.openmetadata.service.search.models.SearchSuggest;
@ -38,9 +37,6 @@ public class UserIndex implements SearchIndex {
public Map<String, Object> buildSearchIndexDocInternal(Map<String, Object> doc) {
Map<String, Object> commonAttributes = getCommonAttributesMap(user, Entity.USER);
doc.putAll(commonAttributes);
doc.put(
"displayName",
CommonUtil.nullOrEmpty(user.getDisplayName()) ? user.getName() : user.getDisplayName());
if (user.getIsBot() == null) {
doc.put("isBot", false);
}

View File

@ -8,11 +8,12 @@ import static org.openmetadata.service.Entity.DATA_PRODUCT;
import static org.openmetadata.service.Entity.DOMAIN;
import static org.openmetadata.service.Entity.FIELD_DESCRIPTION;
import static org.openmetadata.service.Entity.FIELD_DISPLAY_NAME;
import static org.openmetadata.service.Entity.FIELD_NAME;
import static org.openmetadata.service.Entity.GLOSSARY_TERM;
import static org.openmetadata.service.Entity.QUERY;
import static org.openmetadata.service.Entity.RAW_COST_ANALYSIS_REPORT_DATA;
import static org.openmetadata.service.exception.CatalogGenericExceptionMapper.getResponse;
import static org.openmetadata.service.search.EntityBuilderConstant.API_RESPONSE_SCHEMA_FIELD;
import static org.openmetadata.service.search.EntityBuilderConstant.API_RESPONSE_SCHEMA_FIELD_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.COLUMNS_NAME_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.DATA_MODEL_COLUMNS_NAME_KEYWORD;
import static org.openmetadata.service.search.EntityBuilderConstant.DOMAIN_DISPLAY_NAME_KEYWORD;
@ -20,7 +21,6 @@ import static org.openmetadata.service.search.EntityBuilderConstant.ES_MESSAGE_S
import static org.openmetadata.service.search.EntityBuilderConstant.ES_TAG_FQN_FIELD;
import static org.openmetadata.service.search.EntityBuilderConstant.FIELD_COLUMN_NAMES;
import static org.openmetadata.service.search.EntityBuilderConstant.FIELD_DISPLAY_NAME_NGRAM;
import static org.openmetadata.service.search.EntityBuilderConstant.FIELD_NAME_NGRAM;
import static org.openmetadata.service.search.EntityBuilderConstant.MAX_AGGREGATE_SIZE;
import static org.openmetadata.service.search.EntityBuilderConstant.MAX_RESULT_HITS;
import static org.openmetadata.service.search.EntityBuilderConstant.OWNER_DISPLAY_NAME_KEYWORD;
@ -81,6 +81,7 @@ import org.openmetadata.service.search.SearchClient;
import org.openmetadata.service.search.SearchIndexUtils;
import org.openmetadata.service.search.SearchRequest;
import org.openmetadata.service.search.SearchSortFilter;
import org.openmetadata.service.search.indexes.APIEndpointIndex;
import org.openmetadata.service.search.indexes.ContainerIndex;
import org.openmetadata.service.search.indexes.DashboardDataModelIndex;
import org.openmetadata.service.search.indexes.DashboardIndex;
@ -521,6 +522,9 @@ public class OpenSearchClient implements SearchClient {
}
searchSourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
if (request.isExplain()) {
searchSourceBuilder.explain(true);
}
try {
SearchResponse searchResponse =
client.search(
@ -928,43 +932,27 @@ public class OpenSearchClient implements SearchClient {
return responseMap;
}
private static FunctionScoreQueryBuilder boostScore(
QueryStringQueryBuilder queryBuilder, String query) {
FunctionScoreQueryBuilder.FilterFunctionBuilder exactMatchBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("displayName.keyword", query),
ScoreFunctionBuilders.weightFactorFunction(10));
FunctionScoreQueryBuilder.FilterFunctionBuilder nameBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.boolQuery()
.mustNot(
QueryBuilders.existsQuery(
"displayName.keyword")) // Only use name if displayName doesn't exist
.must(QueryBuilders.matchQuery("name.keyword", query)),
ScoreFunctionBuilders.weightFactorFunction(8.0f));
private static FunctionScoreQueryBuilder boostScore(QueryStringQueryBuilder queryBuilder) {
FunctionScoreQueryBuilder.FilterFunctionBuilder tier1Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier1"),
ScoreFunctionBuilders.weightFactorFunction(5.0f));
ScoreFunctionBuilders.weightFactorFunction(50.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder tier2Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier2"),
ScoreFunctionBuilders.weightFactorFunction(3.0f));
ScoreFunctionBuilders.weightFactorFunction(30.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder tier3Boost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("tier.tagFQN", "Tier3"),
ScoreFunctionBuilders.weightFactorFunction(1.0f));
ScoreFunctionBuilders.weightFactorFunction(15.0f));
FunctionScoreQueryBuilder.FilterFunctionBuilder weeklyStatsBoost =
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.rangeQuery("usageSummary.weeklyStats.count").gt(0),
ScoreFunctionBuilders.fieldValueFactorFunction("usageSummary.weeklyStats.count")
.factor(1.5f)
.factor(4.0f)
.modifier(FieldValueFactorFunction.Modifier.SQRT)
.missing(1));
@ -972,7 +960,7 @@ public class OpenSearchClient implements SearchClient {
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.rangeQuery("totalVotes").gt(0),
ScoreFunctionBuilders.fieldValueFactorFunction("totalVotes")
.factor(2.0f)
.factor(3.0f)
.modifier(FieldValueFactorFunction.Modifier.LN1P)
.missing(0));
@ -980,26 +968,15 @@ public class OpenSearchClient implements SearchClient {
return QueryBuilders.functionScoreQuery(
queryBuilder,
new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {
nameBoost,
exactMatchBoost,
tier1Boost,
tier2Boost,
tier3Boost,
weeklyStatsBoost,
totalVotesBoost
tier1Boost, tier2Boost, tier3Boost, weeklyStatsBoost, totalVotesBoost
})
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.boostMode(CombineFunction.SUM);
.boostMode(CombineFunction.MULTIPLY);
}
private static HighlightBuilder buildHighlights(List<String> fields) {
List<String> defaultFields =
List.of(
FIELD_DISPLAY_NAME,
FIELD_NAME,
FIELD_DESCRIPTION,
FIELD_DISPLAY_NAME_NGRAM,
FIELD_NAME_NGRAM);
List.of(FIELD_DISPLAY_NAME, FIELD_DESCRIPTION, FIELD_DISPLAY_NAME_NGRAM);
defaultFields = Stream.concat(defaultFields.stream(), fields.stream()).toList();
HighlightBuilder hb = new HighlightBuilder();
for (String field : defaultFields) {
@ -1236,7 +1213,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildPipelineSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, PipelineIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("tasks.name", "tasks.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder.aggregation(
@ -1247,7 +1224,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildMlModelSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, MlModelIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("mlFeatures.name", "mlFeatures.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
return addAggregation(searchSourceBuilder);
@ -1256,7 +1233,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildTopicSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TopicIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb =
buildHighlights(
List.of(
@ -1274,7 +1251,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildDashboardSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DashboardIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("charts.name", "charts.description"));
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder
@ -1292,7 +1269,7 @@ public class OpenSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchIndex.getAllFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
queryBuilder.boostMode(CombineFunction.SUM);
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, null, from, size);
searchSourceBuilder.aggregation(
@ -1310,7 +1287,7 @@ public class OpenSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchIndex.getDefaultFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
return addAggregation(searchSourceBuilder);
@ -1319,10 +1296,10 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildTableSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TableIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb =
buildHighlights(List.of("columns.name", "columns.description", "columns.children.name"));
queryBuilder.boostMode(CombineFunction.SUM);
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
searchSourceBuilder.aggregation(
@ -1351,7 +1328,7 @@ public class OpenSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, GlossaryTermIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("synonyms"));
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1366,7 +1343,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildTagSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TagIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1379,7 +1356,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildContainerSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, ContainerIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb =
buildHighlights(
List.of(
@ -1399,7 +1376,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildQuerySearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, QueryIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
return searchBuilder(queryBuilder, hb, from, size);
}
@ -1407,7 +1384,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildTestCaseSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TestCaseIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(List.of("testSuite.name", "testSuite.description"));
return searchBuilder(queryBuilder, hb, from, size);
}
@ -1415,7 +1392,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildStoredProcedureSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, StoredProcedureIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1426,7 +1403,7 @@ public class OpenSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DashboardDataModelIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1447,7 +1424,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildDomainsSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DomainIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
return searchBuilder(queryBuilder, hb, from, size);
}
@ -1455,7 +1432,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildSearchEntitySearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, SearchEntityIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -1468,11 +1445,12 @@ public class OpenSearchClient implements SearchClient {
String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, TestCaseResolutionStatusIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
return searchBuilder(queryBuilder, hb, from, size);
}
private static QueryStringQueryBuilder buildSearchQueryBuilder(
String query, Map<String, Float> fields) {
return QueryBuilders.queryStringQuery(query)
@ -1484,6 +1462,20 @@ public class OpenSearchClient implements SearchClient {
.tieBreaker(0.5f);
}
private static SearchSourceBuilder buildApiEndpointSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, APIEndpointIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder = searchBuilder(queryBuilder, hb, from, size);
searchSourceBuilder
.aggregation(
AggregationBuilders.terms(API_RESPONSE_SCHEMA_FIELD)
.field(API_RESPONSE_SCHEMA_FIELD_KEYWORD))
.aggregation(AggregationBuilders.terms(SCHEMA_FIELD_NAMES).field(SCHEMA_FIELD_NAMES));
return addAggregation(searchSourceBuilder);
}
private static SearchSourceBuilder buildAggregateSearchBuilder(String query, int from, int size) {
QueryStringQueryBuilder queryBuilder =
QueryBuilders.queryStringQuery(query)
@ -1529,7 +1521,7 @@ public class OpenSearchClient implements SearchClient {
private static SearchSourceBuilder buildDataProductSearch(String query, int from, int size) {
QueryStringQueryBuilder queryStringBuilder =
buildSearchQueryBuilder(query, DataProductIndex.getFields());
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder, query);
FunctionScoreQueryBuilder queryBuilder = boostScore(queryStringBuilder);
HighlightBuilder hb = buildHighlights(new ArrayList<>());
SearchSourceBuilder searchSourceBuilder =
new SearchSourceBuilder().query(queryBuilder).highlighter(hb).from(from).size(size);
@ -2255,7 +2247,9 @@ public class OpenSearchClient implements SearchClient {
case "data_product_search_index" -> buildDataProductSearch(q, from, size);
case "test_case_resolution_status_search_index" -> buildTestCaseResolutionStatusSearch(
q, from, size);
case "mlmodel_service_search_index",
case "api_endpoint_search_index", "apiEndpoint" -> buildApiEndpointSearch(q, from, size);
case "api_service_search_index",
"mlmodel_service_search_index",
"database_service_search_index",
"messaging_service_index",
"dashboard_service_index",

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,37 +1,50 @@
{
"settings": {
"analysis": {
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"char_filter": [],
"filter": [
"lowercase"
]
}
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"filter": [
"lowercase",
"om_stemmer"
]
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"char_filter": [],
"filter": [
"lowercase"
]
}
},
"analyzer": {
"om_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}
}
},
},
"mappings": {
"properties": {
"id": {

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}

View File

@ -1,6 +1,14 @@
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
@ -12,25 +20,27 @@
},
"analyzer": {
"om_analyzer": {
"tokenizer": "letter",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter_filter",
"om_stemmer"
]
},
"om_ngram": {
"tokenizer": "ngram",
"min_gram": 3,
"max_gram": 10,
"filter": [
"lowercase"
]
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
}
},
"filter": {
"om_stemmer": {
"type": "stemmer",
"name": "english"
"name": "kstem"
},
"word_delimiter_filter": {
"type": "word_delimiter",
"preserve_original": true
}
}
}