Выберите документы, которые содержат определенное количество элементов вложенных документов - PullRequest
0 голосов
/ 21 марта 2019

У меня есть структура (события - это вложенные документы):

{
  "id": 1,
  "events": [
    {
      "id": 1,
      "date": "<date 1>"
    },
    {
      "id": 2,
      "date": "<date 2>"
    },
    {
      "id": 4,
      "date": "<date 3>"
    }
  ]
}
...

Используя Elasticsearch.Net и NEST, как сделать запрос, который выбирает документы, события которых превышают определенное число?

Ответы [ 2 ]

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

Если вы не обновите events с помощью скрипта, я просто сохраню фактическое количество событий в родительском документе.Это сделало бы поисковую часть более простой и эффективной.

Схема документа:

public class Document
{
    public int Id { get; set; }
    public int EventsCount => Events?.Count ?? 0;
    public List<Event> Events { get; set; }
}

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

и запрос:

_elasticClient.Search<Document>(s => s
    .Query(q => q
        .Term(t => t.Field(f => f.EventsCount).Value(10))));
1 голос
/ 21 марта 2019

Сценарий заметки работает медленно, если у вас много документов, лучше задать поле = количество событий и запросить его.

QueryContainer filterContainer = null;
    filterContainer &= Query<YOURTYPE>.Script(s =>
                    s.Inline("params._source.events.size() > YOURNUMBER"));

    Client.Search<YOURTYPE>(s => s
                                .MatchAll()
                                .Size(10000)
                                .Query(q => q.Bool(b => b.Must(filterContainer )))
...