Как создать запрос фильтра bool с вложенным bool следует запросить с помощью NEST OIS - PullRequest
0 голосов
/ 10 мая 2019

У меня проблемы с использованием 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; }
...