use of org.finra.herd.model.api.xml.Facet in project herd by FINRAOS.
the class ElasticSearchHelperTest method testGetFacetsResponseIncludingTagWithNoAssociatedBdefsNewTagType.
@Test
public void testGetFacetsResponseIncludingTagWithNoAssociatedBdefsNewTagType() {
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, Collections.singletonList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
TagTypeIndexSearchResponseDto tagType3 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_3, Collections.singletonList(new TagIndexSearchResponseDto(TAG_CODE_2, 1, TAG_CODE_DISPLAY_NAME_2)), TAG_TYPE_DISPLAY_NAME_3);
List<TagTypeIndexSearchResponseDto> tagTypeIndexSearchResponseDtos = new ArrayList<>();
tagTypeIndexSearchResponseDtos.add(tagType3);
elasticsearchResponseDto.setTagTypeIndexSearchResponseDtos(tagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticsearchHelper.getFacetsResponse(elasticsearchResponseDto, BUSINESS_OBJECT_DEFINITION_SEARCH_INDEX_NAME, TAG_SEARCH_INDEX_NAME);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE, new ArrayList<>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, 1L, FacetTypeEnum.TAG.value(), TAG_CODE, null));
List<Facet> newTagFacet = new ArrayList<>();
newTagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME_2, 1L, FacetTypeEnum.TAG.value(), TAG_CODE_2, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE_2, tagFacet));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_3, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE_3, newTagFacet));
assertEquals(expectedFacets, facets);
}
use of org.finra.herd.model.api.xml.Facet in project herd by FINRAOS.
the class ElasticSearchHelperTest method testGetFacetsResponse.
@Test
public void testGetFacetsResponse() {
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, Collections.singletonList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
List<ResultTypeIndexSearchResponseDto> resultTypeIndexSearchResponseDtos = new ArrayList<>();
resultTypeIndexSearchResponseDtos.add(new ResultTypeIndexSearchResponseDto(TAG_CODE, TAG_COUNT, TAG_SEARCH_INDEX_NAME));
elasticsearchResponseDto.setResultTypeIndexSearchResponseDtos(resultTypeIndexSearchResponseDtos);
List<Facet> facets = elasticsearchHelper.getFacetsResponse(elasticsearchResponseDto, BUSINESS_OBJECT_DEFINITION_SEARCH_INDEX_NAME, TAG_SEARCH_INDEX_NAME);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE, new ArrayList<>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, 1L, FacetTypeEnum.TAG.value(), TAG_CODE, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE_2, tagFacet));
expectedFacets.add(new Facet(SearchIndexTypeEntity.SearchIndexTypes.TAG.name(), 120L, FacetTypeEnum.RESULT_TYPE.value(), SearchIndexTypeEntity.SearchIndexTypes.TAG.name(), null));
assertEquals(expectedFacets, facets);
}
use of org.finra.herd.model.api.xml.Facet in project herd by FINRAOS.
the class ElasticSearchHelperTest method testGetFacetsResponseIncludingTagWithNoAssociatedBdefs.
@Test
public void testGetFacetsResponseIncludingTagWithNoAssociatedBdefs() {
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, Collections.singletonList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
TagTypeIndexSearchResponseDto tagType3 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, Collections.singletonList(new TagIndexSearchResponseDto(TAG_CODE_2, 1, TAG_CODE_DISPLAY_NAME_2)), TAG_TYPE_DISPLAY_NAME_2);
List<TagTypeIndexSearchResponseDto> tagTypeIndexSearchResponseDtos = new ArrayList<>();
tagTypeIndexSearchResponseDtos.add(tagType3);
elasticsearchResponseDto.setTagTypeIndexSearchResponseDtos(tagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticsearchHelper.getFacetsResponse(elasticsearchResponseDto, BUSINESS_OBJECT_DEFINITION_SEARCH_INDEX_NAME, TAG_SEARCH_INDEX_NAME);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE, new ArrayList<>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, 1L, FacetTypeEnum.TAG.value(), TAG_CODE, null));
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME_2, 1L, FacetTypeEnum.TAG.value(), TAG_CODE_2, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2, null, FacetTypeEnum.TAG_TYPE.value(), TAG_TYPE_CODE_2, tagFacet));
assertEquals(expectedFacets, facets);
}
use of org.finra.herd.model.api.xml.Facet in project herd by FINRAOS.
the class ElasticSearchHelperTest method testGetFacetsResponseWithEmptyResponseDto.
@Test
public void testGetFacetsResponseWithEmptyResponseDto() {
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<Facet> facets = elasticsearchHelper.getFacetsResponse(elasticsearchResponseDto, BUSINESS_OBJECT_DEFINITION_SEARCH_INDEX_NAME, TAG_SEARCH_INDEX_NAME);
assertThat("Facet size is not equal to 0.", facets.size(), equalTo(0));
}
use of org.finra.herd.model.api.xml.Facet in project herd by FINRAOS.
the class IndexSearchDaoImpl method indexSearch.
@Override
public IndexSearchResponse indexSearch(final IndexSearchRequest indexSearchRequest, final Set<String> fields, final Set<String> match, final String bdefActiveIndex, final String tagActiveIndex) {
boolean negationTermsExist = herdSearchQueryHelper.determineNegationTermsPresent(indexSearchRequest);
// Build a basic Boolean query upon which add all the necessary clauses as needed
BoolQueryBuilder indexSearchQueryBuilder = QueryBuilders.boolQuery();
String searchPhrase = indexSearchRequest.getSearchTerm();
// Add the negation queries builder within a 'must-not' clause to the parent bool query if negation terms exist
if (negationTermsExist) {
// Build negation queries- each term is added to the query with a 'must-not' clause,
List<String> negationTerms = herdSearchQueryHelper.extractNegationTerms(indexSearchRequest);
if (CollectionUtils.isNotEmpty(negationTerms)) {
negationTerms.forEach(term -> {
indexSearchQueryBuilder.mustNot(buildMultiMatchQuery(term, PHRASE, 100f, FIELD_TYPE_STEMMED, match));
});
}
// Remove the negation terms from the search phrase
searchPhrase = herdSearchQueryHelper.extractSearchPhrase(indexSearchRequest);
}
// Build a Dismax query with three primary components (multi-match queries) with boost values, these values can be configured in the
// DB which provides a way to dynamically tune search behavior at runtime:
// 1. Phrase match query on shingles fields.
// 2. Phrase prefix query on stemmed fields.
// 3. Best fields query on ngrams fields.
final MultiMatchQueryBuilder phrasePrefixMultiMatchQueryBuilder = buildMultiMatchQuery(searchPhrase, PHRASE_PREFIX, configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_PHRASE_PREFIX_QUERY_BOOST, Float.class), FIELD_TYPE_STEMMED, match);
final MultiMatchQueryBuilder bestFieldsMultiMatchQueryBuilder = buildMultiMatchQuery(searchPhrase, BEST_FIELDS, configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_BEST_FIELDS_QUERY_BOOST, Float.class), FIELD_TYPE_NGRAMS, match);
final MultiMatchQueryBuilder phraseMultiMatchQueryBuilder = buildMultiMatchQuery(searchPhrase, PHRASE, configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_PHRASE_QUERY_BOOST, Float.class), FIELD_TYPE_SHINGLES, match);
final MultiMatchQueryBuilder phraseStemmedMultiMatchQueryBuilder = buildMultiMatchQuery(searchPhrase, PHRASE, configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_PHRASE_QUERY_BOOST, Float.class), FIELD_TYPE_STEMMED, match);
// Add the multi match queries to a dis max query and add to the parent bool query within a 'must' clause
indexSearchQueryBuilder.must(disMaxQuery().add(phrasePrefixMultiMatchQueryBuilder).add(bestFieldsMultiMatchQueryBuilder).add(phraseMultiMatchQueryBuilder).add(phraseStemmedMultiMatchQueryBuilder));
// Add filter clauses if index search filters are specified in the request
if (CollectionUtils.isNotEmpty(indexSearchRequest.getIndexSearchFilters())) {
indexSearchQueryBuilder.filter(elasticsearchHelper.addIndexSearchFilterBooleanClause(indexSearchRequest.getIndexSearchFilters(), bdefActiveIndex, tagActiveIndex));
}
// Get function score query builder
FunctionScoreQueryBuilder functionScoreQueryBuilder = getFunctionScoreQueryBuilder(indexSearchQueryBuilder, bdefActiveIndex);
// The fields in the search indexes to return
final String[] searchSources = { NAME_SOURCE, NAMESPACE_CODE_SOURCE, TAG_CODE_SOURCE, TAG_TYPE_CODE_SOURCE, DISPLAY_NAME_SOURCE, DESCRIPTION_SOURCE, BDEF_TAGS_SOURCE, BDEF_TAGS_SEARCH_SCORE_MULTIPLIER };
// Create a new indexSearch source builder
final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// Fetch only the required fields
searchSourceBuilder.fetchSource(searchSources, null);
searchSourceBuilder.query(functionScoreQueryBuilder);
// Create a indexSearch request builder
SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(new ElasticsearchClientImpl(), SearchAction.INSTANCE);
searchRequestBuilder.setIndices(bdefActiveIndex, tagActiveIndex);
searchRequestBuilder.setSource(searchSourceBuilder).setSize(SEARCH_RESULT_SIZE).addSort(SortBuilders.scoreSort());
// Add highlighting if specified in the request
if (BooleanUtils.isTrue(indexSearchRequest.isEnableHitHighlighting())) {
// Fetch configured 'tag' values for highlighting
String preTag = configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_HIGHLIGHT_PRETAGS);
String postTag = configurationHelper.getProperty(ConfigurationValue.ELASTICSEARCH_HIGHLIGHT_POSTTAGS);
searchRequestBuilder.highlighter(buildHighlightQuery(preTag, postTag, match));
}
// Add facet aggregations if specified in the request
if (CollectionUtils.isNotEmpty(indexSearchRequest.getFacetFields())) {
searchRequestBuilder = elasticsearchHelper.addFacetFieldAggregations(new HashSet<>(indexSearchRequest.getFacetFields()), searchRequestBuilder);
}
// Log the actual elasticsearch query when debug is enabled
LOGGER.debug("indexSearchRequest={}", searchRequestBuilder.toString());
// Retrieve the indexSearch response
final Search.Builder searchBuilder = new Search.Builder(searchRequestBuilder.toString()).addIndices(Arrays.asList(bdefActiveIndex, tagActiveIndex));
final SearchResult searchResult = jestClientHelper.searchExecute(searchBuilder.build());
final List<IndexSearchResult> indexSearchResults = buildIndexSearchResults(fields, tagActiveIndex, bdefActiveIndex, searchResult, indexSearchRequest.isEnableHitHighlighting());
List<Facet> facets = null;
if (CollectionUtils.isNotEmpty(indexSearchRequest.getFacetFields())) {
// Extract facets from the search response
facets = new ArrayList<>(extractFacets(indexSearchRequest, searchResult, bdefActiveIndex, tagActiveIndex));
}
return new IndexSearchResponse(searchResult.getTotal(), indexSearchResults, facets);
}
Aggregations