How to programmatically build up a query

This is opensearch-java 2.2.0:

I am looking at how to translate the RestHighLevelClient in Java to using the new client, but I do not see how to programmatically build up a query in code and then apply it without using the immutable builder constructs (or even by using them). Or do I just drop back to the other library to do these kind of things?

Here is a partial code example just showing how I currently build up a query from provided search criteria at runtime:


		RestHighLevelClient client = OpenSearchHelper.getInstance().getClient();

		SearchRequest searchRequest = new SearchRequest();
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

		searchSourceBuilder.timeout(new TimeValue(15, TimeUnit.SECONDS));

		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

		if (StringUtils.isNotBlank(criteria.getFullTextSearch().trim())) {
			String temp = StringHelper.SplitWords(criteria.getFullTextSearch().toLowerCase());
			String words[] = temp.split("\\s+");
			for (String word : words)
				boolQuery = boolQuery.must(QueryBuilders.prefixQuery("fulltextsearch", word));
		} else {
			boolQuery = boolQuery.must(QueryBuilders.matchAllQuery());
		}

		if (criteria.getFilters() != null) {
			for (SearchFilterField filter : criteria.getFilters()) {
				if ((filter != null) && StringUtils.isNotBlank(filter.getFieldName())) {
					String fieldName = filter.getFieldName().toLowerCase();
					if (filter.getFieldValue().equals(_ISNULL)) {
						boolQuery = boolQuery.mustNot(QueryBuilders.existsQuery(fieldName));
					} else if (filter.getFieldValue().equals(_ISNOTNULL)) {
						boolQuery = boolQuery.must(QueryBuilders.existsQuery(fieldName));
					} else if (filter.getMustNotMatch()) {
						boolQuery = boolQuery.mustNot(QueryBuilders.termQuery(fieldName, ParseFieldValue(filter)));
					} else {
						if (filter.getFieldValue().contains(_WILDCARD)) {
							String temp = StringHelper.SplitWords(filter.getFieldValue().toLowerCase().replace(_WILDCARD, " "));
							String words[] = temp.split("\\s+");
							for (String word : words)
								boolQuery = boolQuery.must(QueryBuilders.prefixQuery(fieldName, word));				
						} else if (StringUtils.isNotBlank(filter.getMinValue()) || StringUtils.isNotBlank(filter.getMaxValue())) {
							if (StringUtils.isBlank(filter.getMinValue())) {
								filter.setMinValue("0");
							}
							if (StringUtils.isBlank(filter.getMaxValue())) {
								filter.setMaxValue("9999");
							}

							SearchFilterField beginFilter = new SearchFilterField();
							beginFilter.setFieldName(fieldName);
							beginFilter.setFieldValue(filter.getMinValue());

							SearchFilterField endFilter = new SearchFilterField();
							endFilter.setFieldName(fieldName);
							endFilter.setFieldValue(filter.getMaxValue());

							boolQuery = boolQuery.filter(QueryBuilders.rangeQuery(fieldName).from(ParseFieldValue(beginFilter)).to(ParseFieldValue(endFilter)));							
						} else {
							boolQuery = boolQuery.must(QueryBuilders.termQuery(fieldName, ParseFieldValue(filter)));
						}
					}
				}
			}
		}

		if (StringUtils.isNotBlank(criteria.getDateRangeBegin()) && StringUtils.isNotBlank(criteria.getDateRangeEnd()))
		{
			try {
				ZonedDateTime beginDate = DateHelper.fixTimeZoneAndReturnZonedTime(criteria.getDateRangeBegin());
				ZonedDateTime endDate =  DateHelper.fixTimeZoneAndReturnZonedTime(criteria.getDateRangeEnd());
				if (beginDate.isBefore(endDate) || beginDate.equals(endDate)) {
					boolQuery = boolQuery.filter(QueryBuilders.rangeQuery(criteria.getDateRangeField().toLowerCase()).from(beginDate).to(endDate));
				}
			} catch (Exception err) {				
				throw new BadRequestException(400, "The begin or end date range filter requested in the search criteria is not in a valid date format or the end date range does not come after the beginning date range.");
			}
		}

		results.setFilterApplied(criteria);
	
		searchSourceBuilder = searchSourceBuilder
				.from(Math.max(0, criteria.getCurrentPage() - 1) * Math.min(criteria.getPageSize(), 9999));
		searchSourceBuilder = searchSourceBuilder.size(Math.min(criteria.getPageSize(), 9999));

		searchSourceBuilder = searchSourceBuilder.query(boolQuery);
		if (StringUtils.isNotBlank(criteria.getSortByField())) {
			if (String.class.getSimpleName().equalsIgnoreCase(GetFieldTypeByName(criteria.getSortByField()))) {
				searchSourceBuilder = searchSourceBuilder.sort(new FieldSortBuilder(criteria.getSortByField().toLowerCase() + _KW).order(criteria.getSortAsc() ? SortOrder.ASC : SortOrder.DESC));
			} else {
				searchSourceBuilder = searchSourceBuilder.sort(new FieldSortBuilder(criteria.getSortByField().toLowerCase()).order(criteria.getSortAsc() ? SortOrder.ASC : SortOrder.DESC));
			}
		}

		searchRequest.source(searchSourceBuilder);

@boka7 To build a query programmatically, you can use the Query class as below:

Query query = MatchQuery.of(m -> m 
    .field("name")
)._toQuery();
SearchRequest searchRequest = new SearchRequest.Builder().query(q -> q
    .bool(b -> b 
        .must(query)
)).build();

Please let me know if this answers your question.

1 Like