【问题标题】:Is it possible to use lambda expression in an Elasticsearch Path?是否可以在 Elasticsearch 路径中使用 lambda 表达式?
【发布时间】:2020-01-16 19:26:11
【问题描述】:

我有一个包含其他对象集合的索引,该索引又包含一个布尔值,该布尔值只能对集合中的一个对象为真。我希望能够仅检索和排序将此属性设置为 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; }
}

【问题讨论】:

标签: .net elasticsearch lambda nest


【解决方案1】:

您必须像在 .Nested 中的新查询一样传递您的条件

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

【讨论】:

  • 我没有 .Query 作为 .Nested 表达式中的一个可能选项
  • 好吧,我使用 5.5.X es(嵌套 5.3.0)得到了它。你确定?视觉上的反射有时会混乱。
  • 是的,非常确定。曾尝试直接粘贴您的代码并手动编写,但不会构建。会尝试查找从 5.x 到 6.x 的界面有什么变化
【解决方案2】:

我最终做的,似乎正在工作的是添加一个过滤条件:

.Nested(n => n.Path(p => p.InvolvedVessels).Filter(f => f.Term("involvedVessels.isRiskRole", true)))
                    .Field(v => v.InvolvedVessels.First().VesselName.Suffix("keyword"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2021-08-27
    相关资源
    最近更新 更多