return booster;
}
public SearchResponse performSearch(Client client) {
SearchRequestBuilder request = client.prepareSearch(SearchQueueListener.MESSAGES_INDEX);
request.setTypes(SearchQueueListener.MESSAGES_TYPE);
request.addFields(
"title",
"topic_title",
"author",
"postdate",
"topic_id",
"section",
"message",
"group",
"is_comment",
"tag"
);
QueryBuilder esQuery = processQueryString(this.query.getQ());
request.setSize(SEARCH_ROWS);
request.setFrom(this.query.getOffset());
BoolFilterBuilder queryFilter = boolFilter();
if (this.query.getRange().getValue()!=null) {
queryFilter.must(termFilter(query.getRange().getColumn(), query.getRange().getValue()));
}
if (this.query.getInterval().getRange()!=null) {
RangeFilterBuilder dateFilter = rangeFilter(query.getInterval().getColumn());
dateFilter.from(this.query.getInterval().getRange());
queryFilter.must(dateFilter);
}
if (this.query.getUser() != null) {
User user = this.query.getUser();
if (this.query.isUsertopic()) {
queryFilter.must(termFilter("topic_author", user.getNick()));
} else {
queryFilter.must(termFilter("author", user.getNick()));
}
}
if (!queryFilter.hasClauses()) {
request.setQuery(boost(esQuery));
} else {
QueryBuilder rootQuery = filteredQuery(esQuery, queryFilter);
request.setQuery(boost(rootQuery));
}
String section = this.query.getSection();
List<FilterBuilder> postFilters = new ArrayList<>();
if (!Strings.isNullOrEmpty(section)) {
postFilters.add(termFilter("section", this.query.getSection()));
}
request.addAggregation(
filter("sections").subAggregation(
terms("sections").field("section").size(0).subAggregation(
terms("groups").field("group").size(0)
)
).filter(matchAllFilter())
);
request.addAggregation(significantTerms("tags").field("tag").minDocCount(30));
if (!Strings.isNullOrEmpty(this.query.getGroup())) {
postFilters.add(termFilter("group", this.query.getGroup()));
}
if (!postFilters.isEmpty()) {
request.setPostFilter(andFilters(postFilters));
}
request.addSort(query.getSort().getColumn(), query.getSort().order);
setupHighlight(request);
// TODO use Async
return request.execute().actionGet();
}