【问题标题】:How to do a nested query into an array of objects如何对对象数组进行嵌套查询
【发布时间】:2018-02-28 13:18:18
【问题描述】:

我有一个带有嵌套对象数组的简单对象

public class Product {
    public Guid Id { get; set; } = Guid.NewGuid();
    public string Name { get; set; }
    public ProductTag[] Tags {get; set;} = new ProductTag[0];

}
public class ProductTag {
    public string TagName {get; set;}
    public string Color {get; set;} = "orange";
}

其中Tagsmapped as a nested datatype 使用

client.CreateIndex(Indices.Index<Product>(), d =>
   d.Mappings(m =>
      m.Map<Product>(mm => mm
        .AutoMap()
        .Properties(pd => pd
            .Text(tpd => tpd.Name(x => x.Name))
            .Nested<ProductTag>(npd => npd
                .Name(x => x.Tags)
                .AutoMap()
                .Properties(pd2 => pd2
                  .Keyword(kpd => kpd
                    .Name(x => x.Color)
                  )
                )
            )
        )
      )
   )

我无法为我的生活弄清楚如何查询所有产品的产品索引,例如标签带有“橙色”的TagName

我设法做到了这一点,然后我不知道

client.Search<Product>(s => s
    .Query(q => q
       .Nested(nqd => nqd
        .Path(x => x.Tags)
        .Query(qcd => qcd
            .Bool(bqd => bqd
                .Must(qcd
                    .Match(mqd => mqd
                        .??? 
                    )
                )
            )
        )
    )
)

由于Nested 似乎没有设置另一种类型来查询,我对如何进行此查询有点迷茫。

【问题讨论】:

  • 试试 mqd.Tags.TagName,"orange"
  • @sramalingam24 这是使用嵌套闭包模式的 c#,因此它是强类型的。那不会编译
  • 哎呀忘了 .First() 那里。有关类似示例,请参见此处stackoverflow.com/questions/26800533/…
  • @sramalingam24 是的!做到了(也只是.Field("tags.tagName").Query("admiral") 似乎有效 - 在我阅读他们的文档关于他们如何使用隐式转换运算符之前,我没想过尝试它。想要从你的回复中做出答案,我会标记它是正确的?
  • 很高兴你发现它有用,谢谢

标签: .net elasticsearch nest


【解决方案1】:

下面的就可以了

client.Search<Product>(s => s
    .Query(q => q
        .Nested(nqd => nqd
            .Path(x => x.Tags)
            .Query(qcd => qcd
                .Match(mqd => mqd
                    .Field(f => f.Tags.First().TagName)
                    .Query("orange")
                )
            )
        )
    )
);

生成

{
  "query": {
    "nested": {
      "query": {
        "match": {
          "tags.tagName": {
            "query": "orange"
          }
        }
      },
      "path": "tags"
    }
  }
}

获取字段名称的 lambda 表达式就是一个表达式。 NEST 理解在此上下文中的 LINQ 方法 .First() 是遍历目标字段的表达式的一部分。你也可以使用任何

f => f.Tags[0].TagName
f => f.Tags.Last().TagName
f => f.Tags.Single().TagName
f => f.Tags.ElementAt(0).TagName
f => f.Tags.Max().TagName

或任何其他将返回 ProductTag 的 LINQ 表达式,在该表达式上可以访问属性,并且表示 MemberExpression

【讨论】:

    【解决方案2】:

    试试 mqd.Tags.First().TagName,"admiral"

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多