У меня проблемы с использованием NEST для создания этого запроса:
{
"size": 0,
"query": {
"bool": {
"filter": [
{"term": {"status": 0}},
{"term": {"freeRound": false }},
{"term": {"playerId": 189149 }},
{
"range": {
"eventTime": {
"format": "strict_date_optional_time",
"gte": "2019-05-02T00:00:00",
"lte": "2019-05-02T23:59:59"
}
}
},
{
"bool": {
"should": [
{"term": {"extGameId": 527 }},
{"term": {"extGameId": 804 }},
{"term": {"extGameId": 9503 }}
],
"minimum_should_match": 1
}
},
{"term": {"transactionType": 3 }}
]
}
},
"aggs": {
"byGames": {
"terms": {"field": "extGameId" }
},
"sumAgg": {
"sum": {"field": "amount"}
}
}
}
Как видно, мой запрос использует фильтр bool, так как мне не нужна оценка. Внутри у меня есть те TermQuery
с DateRange
частью, которые должны быть выполнены (status, freeRound, playerId и Date range), а затем subbool должен расстаться, говоря, что должен быть выполнен один из extGamesId.
Теперь вот мой код, использующий NEST, пытающийся добиться того же:
//playerId, gameList, startDate and endDate are passed as a parameters
var filters = new List<QueryContainer>();
filters.Add(new TermQuery { Field = new Field("status"), Value = "0" });//status=0
filters.Add(new TermQuery {Field = new Field("freeRound"), Value = false});//freeRound = false
filters.Add(new TermQuery { Field = new Field("playerId"), Value = playerId });//playerId
filters.Add(endDate != null ?
new DateRangeQuery
{
Field = new Field("eventTime"),
GreaterThanOrEqualTo = startDate,
LessThanOrEqualTo = endDate
} :
new DateRangeQuery
{
Field = new Field("eventTime"),
GreaterThanOrEqualTo = startDate
});
if (gameList.Count > 0)
{
var shouldFilter = new List<QueryContainer>();
gameList.ForEach(g => shouldFilter.Add(new TermQuery { Field = new Field("extGameId"), Value = g }));//extGameIds
filters.Add(new BoolQuery { Should = shouldFilter, MinimumShouldMatch = 1 });
}
filters.Add(new TermQuery { Field = new Field("transactionType"), Value = 3 });//transactionType
var searchRequest = new SearchRequest<SomethingHere>()
{
Query = new BoolQuery
{
Filter = filters
},
Aggregations = new SumAggregation("sum_agg", "amount")
};
var responsesResult = _client.Search<SomethingHere>(searchRequest);
Тем не менее, я получаю «Входная строка была в неправильном формате.» ошибка.
Пожалуйста, помогите мне понять, что я делаю не так здесь. Заранее спасибо.
EDIT:
Вот соответствующие сопоставления:
"amount": {
"type": "double"
},
"eventTime": {
"type": "date"
},
"extGameId": {
"type": "keyword"
},
"freeRound": {
"type": "boolean"
},
"playerId": {
"type": "long"
},
"status": {
"type": "keyword"
}
"transactionType": {
"type": "short"
}
А вот и POCO:
[Number(NumberType.Double)]
public decimal Amount { get; set; }
[Date]
public DateTime eventTime { get; set; }
[Keyword]
public string ExtGameId { get; set; }
[Boolean]
public decimal FreeRound { get; set; }
[Number(NumberType.Long)]
public long PlayerId { get; set; }
[Keyword]
public string Status { get; set; }
[Number(NumberType.Short)]
public int TransactionType { get; set; }