Как отсортировать объект по дочерним полям объекта? - PullRequest
1 голос
/ 15 марта 2019

Как я могу отсортировать товары по GroupModel.PeerOrder, но только если GroupModel.ParentGroupId соответствует некоторому идентификатору?

Модели My C #:

public class ProductModel
{
    public int Id { get; set; }
    public int Title { get; set; }
    public List<GroupModel> Groups { get; set; }
}

public class GroupModel
{
    public int Id { get; set; }
    public int Title { get; set; }
    public int ParentGroupId { get; set; }
    public int PeerOrder { get; set; }
}

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Вот чем я закончил (С помощью @ydrall - большое спасибо!:>):

Часть запроса (у нас это прекрасно работает без этой первой части):

"query": {
  "bool": {
        "must": [                
                {
                  "nested": {
                    "path": "groups", 
                    "query": {
                      "bool": {
                        "must": [ 
                          {
                            "match": {
                              "groups.parentGroupId": 3
                            }
                          }
                        ]
                      }
                    }
                  }
                }
    ]
  }
}

Сортирующая часть запроса:

"sort": [
{
    "groups.peerOrder": { 
      "order": "asc",
        "nested_path": "groups",   
      "nested_filter": { 
        "match": {
          "groups.parentGroupId": 3 
        }
      }
    }
 }

Отображения индекса:

 "mappings": {
    "productmodel": {
      "properties": {
          "groups": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "integer"
            },
            "parentGroupId": {
              "type": "integer"
            },
            "peerOrder": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
1 голос
/ 17 марта 2019

Используйте Вложенный запрос , чтобы отфильтровать совпадающие значения " GroupModel.ParentGroupId ", а затем примените Вложенный запрос сортировки , чтобы отсортировать результаты по " GroupModel.PeerOrder ».

Согласно документации:

Вложенный запрос : Вложенный запрос позволяет запрашивать вложенные объекты / документы (см. Вложенное отображение). Запрос выполняется к вложенным объектам / документам, как если бы они были проиндексированы как отдельные документы (они есть внутри), и в результате получается корневой родительский документ (или родительское вложенное отображение). Вот пример отображения:

PUT /my_index
{
    "mappings": {
        "_doc" : {
            "properties" : {
                "obj1" : {
                    "type" : "nested"
                }
            }
        }
    }
}

GET /_search
{
    "query": {
        "nested" : {
            "path" : "obj1",
            "score_mode" : "avg",
            "query" : {
                "bool" : {
                    "must" : [
                    { "match" : {"obj1.name" : "blue"} },
                    { "range" : {"obj1.count" : {"gt" : 5}} }
                    ]
                }
            }
        }
    }
}

Вложенный запрос сортировки : сортировку можно выполнить по значению вложенного поля, даже если это значение существует в отдельном вложенном документе.

GET /_search
{
  "query": {
    "nested": { 
      "path": "comments",
      "filter": {
        "range": {
          "comments.date": {
            "gte": "2014-10-01",
            "lt":  "2014-11-01"
          }
        }
      }
    }
  },
  "sort": {
    "comments.stars": { 
      "order": "asc",   
      "mode":  "min",   
      "nested_filter": { 
        "range": {
          "comments.date": {
            "gte": "2014-10-01",
            "lt":  "2014-11-01"
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...