Эластичная сортировка NEST по отфильтрованным вложенным документам - PullRequest
0 голосов
/ 25 февраля 2019

Мне трудно переводить эластичный запрос в эквивалент C # Nest.

вот мой эластичный запрос

   "from":0,
   "size":15,
   "sort":[  
      {  
        "tags.date" :{
            "order" : "desc",
            "nested" : {
                "path" : "tags",
                "filter" : {
                    "term" : {"tags.id" : 1}
                }
            }
        }

      }
   ],

Когда я пытаюсь сделать это с помощью C # Nest 6.2.0

        .Fomm(0)
        .Size(15)
        .Sort(s => s
            .Descending(sdf => sdf.Tags.First().Date)
            .Field(ff => ff
                .Nested(nstd => nstd
                    .Path(nsp => nsp.Tags)
                    .Filter(f2 => f2
                        .Term(sft => sft
                            .Field(a1 => a1
                                .Tags.First().Id)
                            .Value(1)
                        )
                    )
                )
            )
        )

он производит

   "from":0,
   "size":15,
   "sort":[  
      {  
         "tags.date":{  
            "order":"desc"
         }
      }
   ],

как я могу применить фильтр к вложенным документам?Что мне здесь не хватает?

1 Ответ

0 голосов
/ 25 февраля 2019

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

public class Person 
{
    public IEnumerable<Tag> Tags {get;set;}
}

public class Tag 
{
    public int Id {get;set;}    
    public DateTime Date {get;set;}
}

Это будет выглядеть как

var client = new ElasticClient(settings);

var searchResponse = client.Search<Person>(s => s
    .From(0)
    .Size(15)
    .Sort(so => so
        .Field(f => f
            .Field(ff => ff.Tags.First().Date)
            .Order(Nest.SortOrder.Descending)
            .Nested(n => n
                .Path(p => p.Tags)
                .Filter(fi => fi
                    .Term(sft => sft
                        .Field(ff => ff.Tags.First().Id)
                        .Value(1)
                    )
                )
            )
        )
    )
);

, что дает

{
  "from": 0,
  "size": 15,
  "sort": [
    {
      "tags.date": {
        "nested": {
          "filter": {
            "term": {
              "tags.id": {
                "value": 1
              }
            }
          },
          "path": "tags"
        },
        "order": "desc"
      }
    }
  ]
}
...