聚合上的弹性NEST过滤器

时间:2018-01-29 11:15:05

标签: c# elasticsearch nest

我现在已经成功地使用聚合创建了我的c#Test win表单应用程序,现在我希望能够过滤所述聚合,如果有人选择其中一个(或更多)。

这是我的查询完全符合我的要求,我可以获得它可以在索引中找到的每个规范术语的价格范围存储桶和存储桶。

.Aggregations(a => a
            .Nested("specifications", n => n
                .Path(p => p.ProductSpecification)
                .Aggregations(aa => aa.Terms("groups", sp => sp.Field(p => p.ProductSpecification.Suffix("name"))
                    .Aggregations(aaa => aaa
                        .Terms("attribute", tt => tt.Field(ff => ff.ProductSpecification.Suffix("value"))))
                        )
                        )
                    )
            .Range("price_range", ra => ra
                .Field(p => p.Price)
                .Ranges(
                    r => r.To(50),
                    r => r.From(50).To(100),
                    r => r.From(100).To(150),
                    r => r.From(150).To(200),
                    r => r.From(200).To(250),
                    r => r.From(250)
                    )
                ))
        .Index("myindex")
        .Type("product")
        .Query(q => q
            .MultiMatch(m => m
                .Query(searchBox.Text + "*")
                .Fields(ff => ff
                    .Field(f => f.Name, boost: nameBoost)
                    .Field(f => f.Description, boost: descriptionBoost)
                    .Field(f => f.ProductCode)))));

有人可以指出我如何根据选择任何这些存储桶来过滤结果。

更新(30/01/18)我现在已将此添加到我的查询

&& q.Nested(n => n
            .Path(p => p.ProductSpecification)
            .Query(q2 => q2
                .Terms(t => t
                    .Field(f => f.ProductSpecification.Suffix("name"))
                    .Terms("Guarantee",)
                    )).Query(q3 => q3
                        .Terms(t2 => t2
                            .Field(f2 => f2.ProductSpecification.Suffix("value"))
                            .Terms("3 years","10 years")
                            )))

                    ));

这使我能够将多个值传递到一个Spec过滤器中,但我不确定如何实现的是如何过滤多个规格,以便上面的过滤器保证值为3年或10年 但如果我也想传递"格雷"的值。和"铜"符合"颜色"

添加"颜色"进入我的第一套术语和#34; Gray"和"铜"进入我的第二个术语列表打破所有过滤。 我想我在这附近只需要一点方向

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,当用户从适用于正在执行的查询的价格范围方面中选择价格范围时,您是否要将此价格范围应用于查询?

Post Filter用于此目的,方法是在计算聚合后对搜索结果应用过滤器。

假设用户选择了50-100的价格范围,您的查询就会像

一样
var response = client.Search<Product>(s => s
    .Aggregations(a => a
        .Nested("specifications", n => n
            .Path(p => p.ProductSpecification)
            .Aggregations(aa => aa
                .Terms("groups", sp => sp
                    .Field(p => p.ProductSpecification.Suffix("name"))
                    .Aggregations(aaa => aaa
                        .Terms("attribute", tt => tt
                            .Field(ff => ff.ProductSpecification.Suffix("value"))
                        )
                    )
                )
            )
        )
        .Range("price_range", ra => ra
            .Field(p => p.Price)
            .Ranges(
                r => r.To(50),
                r => r.From(50).To(100),
                r => r.From(100).To(150),
                r => r.From(150).To(200),
                r => r.From(200).To(250),
                r => r.From(250)
            )
        )
    )
    .Index("myindex")
    .Type("product")
    .Query(q => q
        .MultiMatch(m => m
            .Query(searchBox.Text + "*")
            .Fields(ff => ff
                .Field(f => f.Name, boost: nameBoost)
                .Field(f => f.Description, boost: descriptionBoost)
                .Field(f => f.ProductCode)
            )
        )
    )
    .PostFilter(pf => pf
        .Range(r => r
            .Field(f => f.Price)
            .GreaterThanOrEquals(50)
            .LessThan(100)
        )
    )
);