How to combine a term query with a suggestion using Spring Data Elastic Search

Viewed 48

I need to ensure that my suggestions come from documents with a particular join field. I can create a term query:

QueryBuilder typeFilter = QueryBuilders.termQuery("joinField", "foo");

And I can run a search with suggestbuilder:

SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("fieldname", SuggestBuilders
   .phraseSuggestion("fieldname")
   .text(searchTerm)
   .size(10));

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
sourceBuilder.suggest(suggestBuilder);
SearchRequest searchRequest = new SearchRequest("MyIndex")
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

But I can't see how to get suggestions only from documents returned by the termQuery.

NB "client" here is a RestHighLevelClient. I am using spring-data-elastic-search:4.1.5. NativeSearchQueryBuilder.withSuggestBuilder is not available to me because that was introduced in 4.3 and I am not able to upgrade

1 Answers

Looks like collateQuery is what I was looking for:

QueryBuilder typeFilter = QueryBuilders.termQuery("joinField", "foo");

SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("fieldname", SuggestBuilders
   .phraseSuggestion("fieldname")
   .collateQuery(typeFilter.toString())
   .text(searchTerm)
   .size(10));
Related