-
Notifications
You must be signed in to change notification settings - Fork 1k
/
ESMessageList.java
58 lines (52 loc) · 2.74 KB
/
ESMessageList.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package org.graylog.plugins.enterprise.search.elasticsearch.searchtypes;
import io.searchbox.core.SearchResult;
import io.searchbox.core.search.aggregation.MetricAggregation;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.graylog.plugins.enterprise.search.Query;
import org.graylog.plugins.enterprise.search.SearchJob;
import org.graylog.plugins.enterprise.search.SearchType;
import org.graylog.plugins.enterprise.search.elasticsearch.ESGeneratedQueryContext;
import org.graylog.plugins.enterprise.search.searchtypes.MessageList;
import org.graylog.plugins.enterprise.search.searchtypes.Sort;
import org.graylog2.indexer.results.ResultMessage;
import org.graylog2.plugin.Message;
import org.graylog2.rest.models.messages.responses.ResultMessageSummary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ESMessageList implements ESSearchTypeHandler<MessageList> {
private static final Logger LOG = LoggerFactory.getLogger(ESMessageList.class);
@Override
public void doGenerateQueryPart(SearchJob job, Query query, MessageList messageList, ESGeneratedQueryContext queryContext) {
if (messageList.filter() != null) {
LOG.warn("Search type messages currently does not support filters yet.");
}
final SearchSourceBuilder searchSourceBuilder = queryContext.searchSourceBuilder();
searchSourceBuilder
.size(messageList.limit() - messageList.offset())
.from(messageList.offset());
final List<Sort> sorts = messageList.sort();
if (sorts == null) {
searchSourceBuilder.sort(Message.FIELD_TIMESTAMP, SortOrder.DESC);
} else {
sorts.forEach(sort -> {
searchSourceBuilder.sort(sort.field(), sort.order());
});
}
}
@Override
public SearchType.Result doExtractResult(SearchJob job, Query query, MessageList searchType, SearchResult result, MetricAggregation aggregations, ESGeneratedQueryContext queryContext) {
//noinspection unchecked
final List<ResultMessageSummary> messages = result.getHits(Map.class, false).stream()
.map(hit -> ResultMessage.parseFromSource(hit.id, hit.index, (Map<String, Object>) hit.source, hit.highlight))
.map((resultMessage) -> ResultMessageSummary.create(resultMessage.highlightRanges, resultMessage.getMessage().getFields(), resultMessage.getIndex()))
.collect(Collectors.toList());
return MessageList.Result.result(searchType.id())
.messages(messages)
.totalResults(result.getTotal())
.build();
}
}