如何基于多个术语过滤嵌套文档?

问题描述 投票:0回答:1

我正在尝试在NEST中复制此DSL查询。基本上是一种结构化的过滤器,它将返回所有颜色为红色的产品。

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "keywordFacets",
            "query": {
              "bool": {
                "filter": [
                  { "term": { "keywordFacets.name": "color" } },
                  { "term": { "keywordFacets.value": "Red" } }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

这里是带有属性映射的POCO。

[ElasticsearchType]
public class Product
{
    [Keyword]
    public long ProductId { get; set; }

    [Nested]
    public List<KeywordFacet> KeywordFacets { get; set; }

    // other properties...
}

[ElasticsearchType]
public class KeywordFacet
{
    [Keyword]
    public string Name { get; set; }
    [Keyword]
    public string Value { get; set; }
}

我不知道如何在嵌套的过滤器数组中获得两个术语。到目前为止,这是我失败的尝试:

var searchRequest = new SearchDescriptor<Product>()
    .Query(q => q
        .Bool(b => b
            .Filter(bf => bf
                .Nested(nq => nq
                    .Path(nqp => nqp.KeywordFacets)
                    .Query(qq => qq
                        .Bool(bb => bb
                            .Filter(ff => ff
                                .Term(t => t
                                    .Field(p => p.KeywordFacets.First().Name)
                                    .Value("color")
                                    .Field(p2 => p2.KeywordFacets.First().Value).Value("Red")))))))));

这里是一些在邮递员中运行DSL查询时返回的示例数据:

{
    "productId": 183150,
    "keywordFacets": [
        {
            "name": "color",
            "value": "Red"
        },
        {
            "name": "color",
            "value": "Blue"
        },
        {
            "name": "color",
            "value": "Grey"
        }
    ]
}
nest
1个回答
0
投票

经过一段时间的摸索,这是正确的语法。

var searchRequest = new SearchDescriptor<Product>()
    .Query(q => q
        .Bool(b => b
            .Filter(bf => bf
                .Nested(nq => nq
                    .Path(nqp => nqp.KeywordFacets)
                    .Query(qq => qq.Bool(bb => bb
                                     .Filter(ff => ff
                                         .Term(t => t
                                             .Field(p => p.KeywordFacets[0].Name).Value("color"))))
                                 && qq.Bool(bb => bb
                                     .Filter(ff => ff
                                         .Term(t => t
                                             .Field(p2 => p2.KeywordFacets[0].Value).Value("Red"))))
                    )
                )
            )
        )
    );
© www.soinside.com 2019 - 2024. All rights reserved.