Можно ли использовать лямбда-выражение в Elasticsearch Path? - PullRequest
0 голосов
/ 07 января 2020

У меня есть индекс, связывающий среди прочего коллекцию объектов, которая, в свою очередь, содержит логическое значение, которое может быть истинным только для одного объекта в коллекции. Я хочу иметь возможность извлекать и сортировать только элемент с этим свойством, установленным в true. Я использую ES v6.2.4

Это работает, но возвращает первый элемент в коллекции

var vesselSort = await _client.SearchAsync<SearchableSituation>(s => s
.Index(_situationIndexer.IndexName)
.From(message.Query.SearchResultsFrom)
.Size(message.Query.SearchResultsSize)
.Sort(sort => sort.Ascending(f => f.Status)
    .Field(x => x.Nested(y => y.Path(p => p.InvolvedVessels.First()))
        .Field(v => v.InvolvedVessels.First().VesselName.Suffix("keyword"))
        .Order(sortOrder)))
.Query(q => q
    .Bool(m => m
        .Must(queries)))); 

Но я хочу сделать что-то подобное, что не работает:

var vesselSort2 = await _client.SearchAsync<SearchableSituation>(s => s
.Index(_situationIndexer.IndexName)
.From(message.Query.SearchResultsFrom)
.Size(message.Query.SearchResultsSize)
.Sort(sort => sort.Ascending(f => f.Status)
    .Field(x => x.Nested(y => y.Path(p => p.InvolvedVessels.First(v => v.IsRiskRole)))
        .Field(v => v.InvolvedVessels.First(iv=>iv.IsRiskRole).VesselName.Suffix("keyword"))
        .Order(sortOrder)))
.Query(q => q
    .Bool(m => m
        .Must(queries))));

запросы - это необязательный фильтр, который нужно применить, но по умолчанию он пуст

public class SearchableSituation : IEquatable<SearchableSituation>
{
    public Guid SituationId { get; set; }

    public IEnumerable<SearchableInvolvedVessel> InvolvedVessels { get; set;}
}

public class SearchableInvolvedVessel : IEquatable<SearchableInvolvedVessel
{
    public string VesselName { get; set; }

    public bool IsRiskRole { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 16 января 2020

То, что я закончил, и, кажется, работает, было добавить условие фильтра:

.Nested(n => n.Path(p => p.InvolvedVessels).Filter(f => f.Term("involvedVessels.isRiskRole", true)))
                    .Field(v => v.InvolvedVessels.First().VesselName.Suffix("keyword"));
0 голосов
/ 07 января 2020

Вы должны передать свое условие как в новом запросе внутри .Nested

.Nested(
      y => y
      .Path(p => p.InvolvedVessels)
      .Query(qq => qq
             .Bool(*your bool query*)
  ))
...