Remove the ES_TIMESTAMP constant (elastic/elasticsearch#523)
Original commit: elastic/x-pack-elasticsearch@04fa354619
This commit is contained in:
parent
30bbbf0f78
commit
45c8aeb0f2
|
@ -13,6 +13,7 @@ import org.elasticsearch.common.logging.Loggers;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
import org.elasticsearch.search.sort.SortBuilders;
|
import org.elasticsearch.search.sort.SortBuilders;
|
||||||
|
import org.elasticsearch.xpack.prelert.job.results.Bucket;
|
||||||
|
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -60,7 +61,7 @@ abstract class ElasticsearchBatchedDocumentsIterator<T> implements BatchedDocume
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BatchedDocumentsIterator<T> timeRange(long startEpochMs, long endEpochMs) {
|
public BatchedDocumentsIterator<T> timeRange(long startEpochMs, long endEpochMs) {
|
||||||
filterBuilder.timeRange(ElasticsearchMappings.ES_TIMESTAMP, startEpochMs, endEpochMs);
|
filterBuilder.timeRange(Bucket.TIMESTAMP.getPreferredName(), startEpochMs, endEpochMs);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,14 +66,6 @@ public class ElasticsearchMappings {
|
||||||
static final String TYPE = "type";
|
static final String TYPE = "type";
|
||||||
static final String DYNAMIC = "dynamic";
|
static final String DYNAMIC = "dynamic";
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of the field used to store the timestamp in Elasticsearch.
|
|
||||||
* Note the field name is different to {@link org.elasticsearch.xpack.prelert.job.results.Bucket#TIMESTAMP} used by the
|
|
||||||
* API Bucket Resource, and is chosen for consistency with the default field name used by
|
|
||||||
* Logstash and Kibana.
|
|
||||||
*/
|
|
||||||
static final String ES_TIMESTAMP = "timestamp";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of the Elasticsearch field by which documents are sorted by default
|
* Name of the Elasticsearch field by which documents are sorted by default
|
||||||
*/
|
*/
|
||||||
|
@ -125,7 +117,7 @@ public class ElasticsearchMappings {
|
||||||
.startObject(Job.ID.getPreferredName())
|
.startObject(Job.ID.getPreferredName())
|
||||||
.field(TYPE, KEYWORD).field(INCLUDE_IN_ALL, false)
|
.field(TYPE, KEYWORD).field(INCLUDE_IN_ALL, false)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(Bucket.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(Bucket.ANOMALY_SCORE.getPreferredName())
|
.startObject(Bucket.ANOMALY_SCORE.getPreferredName())
|
||||||
|
@ -448,7 +440,7 @@ public class ElasticsearchMappings {
|
||||||
.field(ANALYZER, WHITESPACE)
|
.field(ANALYZER, WHITESPACE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(PROPERTIES)
|
.startObject(PROPERTIES)
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(Quantiles.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(Quantiles.QUANTILE_STATE.getPreferredName())
|
.startObject(Quantiles.QUANTILE_STATE.getPreferredName())
|
||||||
|
@ -539,7 +531,7 @@ public class ElasticsearchMappings {
|
||||||
.startObject(Job.ID.getPreferredName())
|
.startObject(Job.ID.getPreferredName())
|
||||||
.field(TYPE, KEYWORD)
|
.field(TYPE, KEYWORD)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(ModelSnapshot.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
// "description" is analyzed so that it has the same
|
// "description" is analyzed so that it has the same
|
||||||
|
@ -565,17 +557,14 @@ public class ElasticsearchMappings {
|
||||||
|
|
||||||
addModelSizeStatsFieldsToMapping(builder);
|
addModelSizeStatsFieldsToMapping(builder);
|
||||||
|
|
||||||
builder.startObject(ES_TIMESTAMP)
|
builder.endObject()
|
||||||
.field(TYPE, DATE)
|
|
||||||
.endObject()
|
|
||||||
.endObject()
|
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(Quantiles.TYPE.getPreferredName())
|
.startObject(Quantiles.TYPE.getPreferredName())
|
||||||
.startObject(PROPERTIES)
|
.startObject(PROPERTIES)
|
||||||
.startObject(Job.ID.getPreferredName())
|
.startObject(Job.ID.getPreferredName())
|
||||||
.field(TYPE, KEYWORD)
|
.field(TYPE, KEYWORD)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(Quantiles.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(Quantiles.QUANTILE_STATE.getPreferredName())
|
.startObject(Quantiles.QUANTILE_STATE.getPreferredName())
|
||||||
|
@ -643,7 +632,7 @@ public class ElasticsearchMappings {
|
||||||
.field(ANALYZER, WHITESPACE)
|
.field(ANALYZER, WHITESPACE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(PROPERTIES)
|
.startObject(PROPERTIES)
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(Usage.TIMESTAMP)
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.startObject(Usage.INPUT_BYTES)
|
.startObject(Usage.INPUT_BYTES)
|
||||||
|
@ -665,7 +654,7 @@ public class ElasticsearchMappings {
|
||||||
.startObject()
|
.startObject()
|
||||||
.startObject(AuditMessage.TYPE.getPreferredName())
|
.startObject(AuditMessage.TYPE.getPreferredName())
|
||||||
.startObject(PROPERTIES)
|
.startObject(PROPERTIES)
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(AuditMessage.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.endObject()
|
.endObject()
|
||||||
|
@ -678,7 +667,7 @@ public class ElasticsearchMappings {
|
||||||
.startObject()
|
.startObject()
|
||||||
.startObject(AuditActivity.TYPE.getPreferredName())
|
.startObject(AuditActivity.TYPE.getPreferredName())
|
||||||
.startObject(PROPERTIES)
|
.startObject(PROPERTIES)
|
||||||
.startObject(ES_TIMESTAMP)
|
.startObject(AuditActivity.TIMESTAMP.getPreferredName())
|
||||||
.field(TYPE, DATE)
|
.field(TYPE, DATE)
|
||||||
.endObject()
|
.endObject()
|
||||||
.endObject()
|
.endObject()
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class JobDataDeleter {
|
||||||
public void deleteResultsFromTime(long cutoffEpochMs, ActionListener<Boolean> listener) {
|
public void deleteResultsFromTime(long cutoffEpochMs, ActionListener<Boolean> listener) {
|
||||||
String index = JobResultsPersister.getJobIndexName(jobId);
|
String index = JobResultsPersister.getJobIndexName(jobId);
|
||||||
|
|
||||||
RangeQueryBuilder timeRange = QueryBuilders.rangeQuery(ElasticsearchMappings.ES_TIMESTAMP);
|
RangeQueryBuilder timeRange = QueryBuilders.rangeQuery(Bucket.TIMESTAMP.getPreferredName());
|
||||||
timeRange.gte(cutoffEpochMs);
|
timeRange.gte(cutoffEpochMs);
|
||||||
timeRange.lt(new Date().getTime());
|
timeRange.lt(new Date().getTime());
|
||||||
|
|
||||||
|
|
|
@ -280,13 +280,13 @@ public class JobProvider {
|
||||||
public QueryPage<Bucket> buckets(String jobId, BucketsQuery query)
|
public QueryPage<Bucket> buckets(String jobId, BucketsQuery query)
|
||||||
throws ResourceNotFoundException {
|
throws ResourceNotFoundException {
|
||||||
QueryBuilder fb = new ResultsFilterBuilder()
|
QueryBuilder fb = new ResultsFilterBuilder()
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, query.getStart(), query.getEnd())
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), query.getStart(), query.getEnd())
|
||||||
.score(Bucket.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreFilter())
|
.score(Bucket.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreFilter())
|
||||||
.score(Bucket.MAX_NORMALIZED_PROBABILITY.getPreferredName(), query.getNormalizedProbability())
|
.score(Bucket.MAX_NORMALIZED_PROBABILITY.getPreferredName(), query.getNormalizedProbability())
|
||||||
.interim(Bucket.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
.interim(Bucket.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
SortBuilder<?> sortBuilder = new FieldSortBuilder(esSortField(query.getSortField()))
|
SortBuilder<?> sortBuilder = new FieldSortBuilder(query.getSortField())
|
||||||
.order(query.isSortDescending() ? SortOrder.DESC : SortOrder.ASC);
|
.order(query.isSortDescending() ? SortOrder.DESC : SortOrder.ASC);
|
||||||
|
|
||||||
QueryPage<Bucket> buckets = buckets(jobId, query.isIncludeInterim(), query.getFrom(), query.getSize(), fb, sortBuilder);
|
QueryPage<Bucket> buckets = buckets(jobId, query.isIncludeInterim(), query.getFrom(), query.getSize(), fb, sortBuilder);
|
||||||
|
@ -388,7 +388,7 @@ public class JobProvider {
|
||||||
SearchHits hits;
|
SearchHits hits;
|
||||||
try {
|
try {
|
||||||
LOGGER.trace("ES API CALL: get Bucket with timestamp {} from index {}", query.getTimestamp(), indexName);
|
LOGGER.trace("ES API CALL: get Bucket with timestamp {} from index {}", query.getTimestamp(), indexName);
|
||||||
QueryBuilder matchQuery = QueryBuilders.matchQuery(ElasticsearchMappings.ES_TIMESTAMP, query.getTimestamp());
|
QueryBuilder matchQuery = QueryBuilders.matchQuery(Bucket.TIMESTAMP.getPreferredName(), query.getTimestamp());
|
||||||
|
|
||||||
QueryBuilder boolQuery = new BoolQueryBuilder()
|
QueryBuilder boolQuery = new BoolQueryBuilder()
|
||||||
.filter(matchQuery)
|
.filter(matchQuery)
|
||||||
|
@ -458,7 +458,7 @@ public class JobProvider {
|
||||||
String partitionFieldValue)
|
String partitionFieldValue)
|
||||||
throws ResourceNotFoundException {
|
throws ResourceNotFoundException {
|
||||||
QueryBuilder timeRangeQuery = new ResultsFilterBuilder()
|
QueryBuilder timeRangeQuery = new ResultsFilterBuilder()
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, epochStart, epochEnd)
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), epochStart, epochEnd)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
QueryBuilder boolQuery = new BoolQueryBuilder()
|
QueryBuilder boolQuery = new BoolQueryBuilder()
|
||||||
|
@ -466,7 +466,7 @@ public class JobProvider {
|
||||||
.filter(new TermsQueryBuilder(Result.RESULT_TYPE.getPreferredName(), PerPartitionMaxProbabilities.RESULT_TYPE_VALUE))
|
.filter(new TermsQueryBuilder(Result.RESULT_TYPE.getPreferredName(), PerPartitionMaxProbabilities.RESULT_TYPE_VALUE))
|
||||||
.filter(new TermsQueryBuilder(AnomalyRecord.PARTITION_FIELD_VALUE.getPreferredName(), partitionFieldValue));
|
.filter(new TermsQueryBuilder(AnomalyRecord.PARTITION_FIELD_VALUE.getPreferredName(), partitionFieldValue));
|
||||||
|
|
||||||
FieldSortBuilder sb = new FieldSortBuilder(ElasticsearchMappings.ES_TIMESTAMP).order(SortOrder.ASC);
|
FieldSortBuilder sb = new FieldSortBuilder(Bucket.TIMESTAMP.getPreferredName()).order(SortOrder.ASC);
|
||||||
String indexName = JobResultsPersister.getJobIndexName(jobId);
|
String indexName = JobResultsPersister.getJobIndexName(jobId);
|
||||||
SearchRequestBuilder searchBuilder = client
|
SearchRequestBuilder searchBuilder = client
|
||||||
.prepareSearch(indexName)
|
.prepareSearch(indexName)
|
||||||
|
@ -566,7 +566,7 @@ public class JobProvider {
|
||||||
// the scenes, and Elasticsearch documentation claims it's significantly
|
// the scenes, and Elasticsearch documentation claims it's significantly
|
||||||
// slower. Here we rely on the record timestamps being identical to the
|
// slower. Here we rely on the record timestamps being identical to the
|
||||||
// bucket timestamp.
|
// bucket timestamp.
|
||||||
QueryBuilder recordFilter = QueryBuilders.termQuery(ElasticsearchMappings.ES_TIMESTAMP, bucket.getTimestamp().getTime());
|
QueryBuilder recordFilter = QueryBuilders.termQuery(Bucket.TIMESTAMP.getPreferredName(), bucket.getTimestamp().getTime());
|
||||||
|
|
||||||
recordFilter = new ResultsFilterBuilder(recordFilter)
|
recordFilter = new ResultsFilterBuilder(recordFilter)
|
||||||
.interim(AnomalyRecord.IS_INTERIM.getPreferredName(), includeInterim)
|
.interim(AnomalyRecord.IS_INTERIM.getPreferredName(), includeInterim)
|
||||||
|
@ -575,7 +575,7 @@ public class JobProvider {
|
||||||
|
|
||||||
FieldSortBuilder sb = null;
|
FieldSortBuilder sb = null;
|
||||||
if (sortField != null) {
|
if (sortField != null) {
|
||||||
sb = new FieldSortBuilder(esSortField(sortField))
|
sb = new FieldSortBuilder(sortField)
|
||||||
.missing("_last")
|
.missing("_last")
|
||||||
.order(descending ? SortOrder.DESC : SortOrder.ASC);
|
.order(descending ? SortOrder.DESC : SortOrder.ASC);
|
||||||
}
|
}
|
||||||
|
@ -669,7 +669,7 @@ public class JobProvider {
|
||||||
public QueryPage<AnomalyRecord> records(String jobId, RecordsQueryBuilder.RecordsQuery query)
|
public QueryPage<AnomalyRecord> records(String jobId, RecordsQueryBuilder.RecordsQuery query)
|
||||||
throws ResourceNotFoundException {
|
throws ResourceNotFoundException {
|
||||||
QueryBuilder fb = new ResultsFilterBuilder()
|
QueryBuilder fb = new ResultsFilterBuilder()
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, query.getStart(), query.getEnd())
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), query.getStart(), query.getEnd())
|
||||||
.score(AnomalyRecord.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreThreshold())
|
.score(AnomalyRecord.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreThreshold())
|
||||||
.score(AnomalyRecord.NORMALIZED_PROBABILITY.getPreferredName(), query.getNormalizedProbabilityThreshold())
|
.score(AnomalyRecord.NORMALIZED_PROBABILITY.getPreferredName(), query.getNormalizedProbabilityThreshold())
|
||||||
.interim(AnomalyRecord.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
.interim(AnomalyRecord.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
||||||
|
@ -685,7 +685,7 @@ public class JobProvider {
|
||||||
throws ResourceNotFoundException {
|
throws ResourceNotFoundException {
|
||||||
FieldSortBuilder sb = null;
|
FieldSortBuilder sb = null;
|
||||||
if (sortField != null) {
|
if (sortField != null) {
|
||||||
sb = new FieldSortBuilder(esSortField(sortField))
|
sb = new FieldSortBuilder(sortField)
|
||||||
.missing("_last")
|
.missing("_last")
|
||||||
.order(descending ? SortOrder.DESC : SortOrder.ASC);
|
.order(descending ? SortOrder.DESC : SortOrder.ASC);
|
||||||
}
|
}
|
||||||
|
@ -714,7 +714,7 @@ public class JobProvider {
|
||||||
.setFetchSource(true); // the field option turns off source so request it explicitly
|
.setFetchSource(true); // the field option turns off source so request it explicitly
|
||||||
|
|
||||||
for (String sortField : secondarySort) {
|
for (String sortField : secondarySort) {
|
||||||
searchBuilder.addSort(esSortField(sortField), descending ? SortOrder.DESC : SortOrder.ASC);
|
searchBuilder.addSort(sortField, descending ? SortOrder.DESC : SortOrder.ASC);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchResponse searchResponse;
|
SearchResponse searchResponse;
|
||||||
|
@ -756,7 +756,7 @@ public class JobProvider {
|
||||||
*/
|
*/
|
||||||
public QueryPage<Influencer> influencers(String jobId, InfluencersQuery query) throws ResourceNotFoundException {
|
public QueryPage<Influencer> influencers(String jobId, InfluencersQuery query) throws ResourceNotFoundException {
|
||||||
QueryBuilder fb = new ResultsFilterBuilder()
|
QueryBuilder fb = new ResultsFilterBuilder()
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, query.getStart(), query.getEnd())
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), query.getStart(), query.getEnd())
|
||||||
.score(Bucket.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreFilter())
|
.score(Bucket.ANOMALY_SCORE.getPreferredName(), query.getAnomalyScoreFilter())
|
||||||
.interim(Bucket.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
.interim(Bucket.IS_INTERIM.getPreferredName(), query.isIncludeInterim())
|
||||||
.build();
|
.build();
|
||||||
|
@ -771,7 +771,7 @@ public class JobProvider {
|
||||||
LOGGER.trace("ES API CALL: search all of result type {} from index {}{} with filter from {} size {}",
|
LOGGER.trace("ES API CALL: search all of result type {} from index {}{} with filter from {} size {}",
|
||||||
() -> Influencer.RESULT_TYPE_VALUE, () -> indexName,
|
() -> Influencer.RESULT_TYPE_VALUE, () -> indexName,
|
||||||
() -> (sortField != null) ?
|
() -> (sortField != null) ?
|
||||||
" with sort " + (sortDescending ? "descending" : "ascending") + " on field " + esSortField(sortField) : "",
|
" with sort " + (sortDescending ? "descending" : "ascending") + " on field " + sortField : "",
|
||||||
() -> from, () -> size);
|
() -> from, () -> size);
|
||||||
|
|
||||||
filterBuilder = new BoolQueryBuilder()
|
filterBuilder = new BoolQueryBuilder()
|
||||||
|
@ -784,7 +784,7 @@ public class JobProvider {
|
||||||
.setFrom(from).setSize(size);
|
.setFrom(from).setSize(size);
|
||||||
|
|
||||||
FieldSortBuilder sb = sortField == null ? SortBuilders.fieldSort(ElasticsearchMappings.ES_DOC)
|
FieldSortBuilder sb = sortField == null ? SortBuilders.fieldSort(ElasticsearchMappings.ES_DOC)
|
||||||
: new FieldSortBuilder(esSortField(sortField)).order(sortDescending ? SortOrder.DESC : SortOrder.ASC);
|
: new FieldSortBuilder(sortField).order(sortDescending ? SortOrder.DESC : SortOrder.ASC);
|
||||||
searchRequestBuilder.addSort(sb);
|
searchRequestBuilder.addSort(sb);
|
||||||
|
|
||||||
SearchResponse response;
|
SearchResponse response;
|
||||||
|
@ -913,12 +913,12 @@ public class JobProvider {
|
||||||
return modelSnapshots(jobId, from, size,
|
return modelSnapshots(jobId, from, size,
|
||||||
(sortField == null || sortField.isEmpty()) ? ModelSnapshot.RESTORE_PRIORITY.getPreferredName() : sortField,
|
(sortField == null || sortField.isEmpty()) ? ModelSnapshot.RESTORE_PRIORITY.getPreferredName() : sortField,
|
||||||
sortDescending, fb.timeRange(
|
sortDescending, fb.timeRange(
|
||||||
ElasticsearchMappings.ES_TIMESTAMP, startEpochMs, endEpochMs).build());
|
Bucket.TIMESTAMP.getPreferredName(), startEpochMs, endEpochMs).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
private QueryPage<ModelSnapshot> modelSnapshots(String jobId, int from, int size,
|
private QueryPage<ModelSnapshot> modelSnapshots(String jobId, int from, int size,
|
||||||
String sortField, boolean sortDescending, QueryBuilder fb) {
|
String sortField, boolean sortDescending, QueryBuilder fb) {
|
||||||
FieldSortBuilder sb = new FieldSortBuilder(esSortField(sortField))
|
FieldSortBuilder sb = new FieldSortBuilder(sortField)
|
||||||
.order(sortDescending ? SortOrder.DESC : SortOrder.ASC);
|
.order(sortDescending ? SortOrder.DESC : SortOrder.ASC);
|
||||||
|
|
||||||
// Wrap in a constant_score because we always want to
|
// Wrap in a constant_score because we always want to
|
||||||
|
@ -928,9 +928,9 @@ public class JobProvider {
|
||||||
SearchResponse searchResponse;
|
SearchResponse searchResponse;
|
||||||
try {
|
try {
|
||||||
String indexName = JobResultsPersister.getJobIndexName(jobId);
|
String indexName = JobResultsPersister.getJobIndexName(jobId);
|
||||||
LOGGER.trace("ES API CALL: search all of type " + ModelSnapshot.TYPE +
|
LOGGER.trace("ES API CALL: search all of type {} from index {} sort ascending {} with filter after sort from {} size {}",
|
||||||
" from index " + indexName + " sort ascending " + esSortField(sortField) +
|
ModelSnapshot.TYPE, indexName, sortField, from, size);
|
||||||
" with filter after sort from " + from + " size " + size);
|
|
||||||
searchResponse = client.prepareSearch(indexName)
|
searchResponse = client.prepareSearch(indexName)
|
||||||
.setTypes(ModelSnapshot.TYPE.getPreferredName())
|
.setTypes(ModelSnapshot.TYPE.getPreferredName())
|
||||||
.addSort(sb)
|
.addSort(sb)
|
||||||
|
@ -945,19 +945,6 @@ public class JobProvider {
|
||||||
List<ModelSnapshot> results = new ArrayList<>();
|
List<ModelSnapshot> results = new ArrayList<>();
|
||||||
|
|
||||||
for (SearchHit hit : searchResponse.getHits().getHits()) {
|
for (SearchHit hit : searchResponse.getHits().getHits()) {
|
||||||
// Remove the Kibana/Logstash '@timestamp' entry as stored in Elasticsearch,
|
|
||||||
// and replace using the API 'timestamp' key.
|
|
||||||
Object timestamp = hit.getSource().remove(ElasticsearchMappings.ES_TIMESTAMP);
|
|
||||||
hit.getSource().put(ModelSnapshot.TIMESTAMP.getPreferredName(), timestamp);
|
|
||||||
|
|
||||||
Object o = hit.getSource().get(ModelSizeStats.RESULT_TYPE_FIELD.getPreferredName());
|
|
||||||
if (o instanceof Map) {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, Object> map = (Map<String, Object>) o;
|
|
||||||
Object ts = map.remove(ElasticsearchMappings.ES_TIMESTAMP);
|
|
||||||
map.put(ModelSizeStats.TIMESTAMP_FIELD.getPreferredName(), ts);
|
|
||||||
}
|
|
||||||
|
|
||||||
BytesReference source = hit.getSourceRef();
|
BytesReference source = hit.getSourceRef();
|
||||||
XContentParser parser;
|
XContentParser parser;
|
||||||
try {
|
try {
|
||||||
|
@ -1116,11 +1103,4 @@ public class JobProvider {
|
||||||
public Auditor audit(String jobId) {
|
public Auditor audit(String jobId) {
|
||||||
return new Auditor(client, JobResultsPersister.getJobIndexName(jobId), jobId);
|
return new Auditor(client, JobResultsPersister.getJobIndexName(jobId), jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String esSortField(String sortField) {
|
|
||||||
// Beware: There's an assumption here that Bucket.TIMESTAMP,
|
|
||||||
// AnomalyRecord.TIMESTAMP, Influencer.TIMESTAMP and
|
|
||||||
// ModelSnapshot.TIMESTAMP are all the same
|
|
||||||
return sortField.equals(Bucket.TIMESTAMP.getPreferredName()) ? ElasticsearchMappings.ES_TIMESTAMP : sortField;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.elasticsearch.common.component.AbstractComponent;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.index.engine.VersionConflictEngineException;
|
import org.elasticsearch.index.engine.VersionConflictEngineException;
|
||||||
|
|
||||||
|
import org.elasticsearch.xpack.prelert.job.results.Bucket;
|
||||||
import org.elasticsearch.xpack.prelert.job.usage.Usage;
|
import org.elasticsearch.xpack.prelert.job.usage.Usage;
|
||||||
|
|
||||||
public class UsagePersister extends AbstractComponent {
|
public class UsagePersister extends AbstractComponent {
|
||||||
|
@ -35,7 +36,7 @@ public class UsagePersister extends AbstractComponent {
|
||||||
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXX", Locale.ROOT);
|
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXX", Locale.ROOT);
|
||||||
upsertMap = new HashMap<>();
|
upsertMap = new HashMap<>();
|
||||||
|
|
||||||
upsertMap.put(ElasticsearchMappings.ES_TIMESTAMP, "");
|
upsertMap.put(Bucket.TIMESTAMP.getPreferredName(), "");
|
||||||
upsertMap.put(Usage.INPUT_BYTES, null);
|
upsertMap.put(Usage.INPUT_BYTES, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ public class UsagePersister extends AbstractComponent {
|
||||||
ZonedDateTime nowTruncatedToHour = ZonedDateTime.now().truncatedTo(ChronoUnit.HOURS);
|
ZonedDateTime nowTruncatedToHour = ZonedDateTime.now().truncatedTo(ChronoUnit.HOURS);
|
||||||
String formattedNowTruncatedToHour = nowTruncatedToHour.format(dateTimeFormatter);
|
String formattedNowTruncatedToHour = nowTruncatedToHour.format(dateTimeFormatter);
|
||||||
String docId = USAGE_DOC_ID_PREFIX + formattedNowTruncatedToHour;
|
String docId = USAGE_DOC_ID_PREFIX + formattedNowTruncatedToHour;
|
||||||
upsertMap.put(ElasticsearchMappings.ES_TIMESTAMP, formattedNowTruncatedToHour);
|
upsertMap.put(Usage.TIMESTAMP, formattedNowTruncatedToHour);
|
||||||
|
|
||||||
// update global count
|
// update global count
|
||||||
updateDocument(jobId, PRELERT_USAGE_INDEX, docId, bytesRead, fieldsRead, recordsRead);
|
updateDocument(jobId, PRELERT_USAGE_INDEX, docId, bytesRead, fieldsRead, recordsRead);
|
||||||
|
|
|
@ -8,6 +8,7 @@ package org.elasticsearch.xpack.prelert.job.persistence;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
import org.elasticsearch.index.query.QueryBuilders;
|
import org.elasticsearch.index.query.QueryBuilders;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
import org.elasticsearch.xpack.prelert.job.results.Bucket;
|
||||||
|
|
||||||
public class ResultsFilterBuilderTests extends ESTestCase {
|
public class ResultsFilterBuilderTests extends ESTestCase {
|
||||||
private static final String TIMESTAMP = "timestamp";
|
private static final String TIMESTAMP = "timestamp";
|
||||||
|
@ -27,11 +28,11 @@ public class ResultsFilterBuilderTests extends ESTestCase {
|
||||||
|
|
||||||
public void testBuild_GivenOnlyStartTime() {
|
public void testBuild_GivenOnlyStartTime() {
|
||||||
QueryBuilder expected = QueryBuilders
|
QueryBuilder expected = QueryBuilders
|
||||||
.rangeQuery(ElasticsearchMappings.ES_TIMESTAMP)
|
.rangeQuery(Bucket.TIMESTAMP.getPreferredName())
|
||||||
.gte(1000);
|
.gte(1000);
|
||||||
|
|
||||||
QueryBuilder fb = new ResultsFilterBuilder()
|
QueryBuilder fb = new ResultsFilterBuilder()
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, 1000, null)
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), 1000, null)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertEquals(expected.toString(), fb.toString());
|
assertEquals(expected.toString(), fb.toString());
|
||||||
|
@ -122,7 +123,7 @@ public class ResultsFilterBuilderTests extends ESTestCase {
|
||||||
public void testBuild_GivenCombination() {
|
public void testBuild_GivenCombination() {
|
||||||
QueryBuilder originalFilter = QueryBuilders.existsQuery("someField");
|
QueryBuilder originalFilter = QueryBuilders.existsQuery("someField");
|
||||||
QueryBuilder timeFilter = QueryBuilders
|
QueryBuilder timeFilter = QueryBuilders
|
||||||
.rangeQuery(ElasticsearchMappings.ES_TIMESTAMP)
|
.rangeQuery(Bucket.TIMESTAMP.getPreferredName())
|
||||||
.gte(1000)
|
.gte(1000)
|
||||||
.lt(2000);
|
.lt(2000);
|
||||||
QueryBuilder score1Filter = new ResultsFilterBuilder()
|
QueryBuilder score1Filter = new ResultsFilterBuilder()
|
||||||
|
@ -143,7 +144,7 @@ public class ResultsFilterBuilderTests extends ESTestCase {
|
||||||
.filter(termFilter);
|
.filter(termFilter);
|
||||||
|
|
||||||
QueryBuilder fb = new ResultsFilterBuilder(originalFilter)
|
QueryBuilder fb = new ResultsFilterBuilder(originalFilter)
|
||||||
.timeRange(ElasticsearchMappings.ES_TIMESTAMP, 1000, 2000)
|
.timeRange(Bucket.TIMESTAMP.getPreferredName(), 1000, 2000)
|
||||||
.score("score1", 50.0)
|
.score("score1", 50.0)
|
||||||
.score("score2", 80.0)
|
.score("score2", 80.0)
|
||||||
.interim("isInterim", false)
|
.interim("isInterim", false)
|
||||||
|
|
|
@ -77,7 +77,7 @@ public class UsagePersisterTests extends ESTestCase {
|
||||||
|
|
||||||
List<Map> capturedUpserts = upsertsCaptor.getAllValues();
|
List<Map> capturedUpserts = upsertsCaptor.getAllValues();
|
||||||
assertEquals(2, capturedUpserts.size());
|
assertEquals(2, capturedUpserts.size());
|
||||||
assertEquals(timestamp, capturedUpserts.get(0).get(ElasticsearchMappings.ES_TIMESTAMP).toString());
|
assertEquals(timestamp, capturedUpserts.get(0).get(Usage.TIMESTAMP).toString());
|
||||||
assertEquals(10L, capturedUpserts.get(0).get(Usage.INPUT_BYTES));
|
assertEquals(10L, capturedUpserts.get(0).get(Usage.INPUT_BYTES));
|
||||||
assertEquals(30L, capturedUpserts.get(0).get(Usage.INPUT_FIELD_COUNT));
|
assertEquals(30L, capturedUpserts.get(0).get(Usage.INPUT_FIELD_COUNT));
|
||||||
assertEquals(1L, capturedUpserts.get(0).get(Usage.INPUT_RECORD_COUNT));
|
assertEquals(1L, capturedUpserts.get(0).get(Usage.INPUT_RECORD_COUNT));
|
||||||
|
|
Loading…
Reference in New Issue