【问题标题】:Elastic NEST Filter on Aggregations聚合上的弹性 NEST 过滤器
【发布时间】:2018-02-02 14:59:53
【问题描述】:

我现在成功地让我的 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")
                            )))

                    ));

这使我能够将多个值传递给一个规格过滤器,但我不确定如何实现的是如何过滤多个规格,因此上述 Guarantee 上的过滤器具有 3 年或 10 年的值 但如果我还想将“灰色”和“铜”的值传递给“颜色”的规范

在我的第一组术语中添加“颜色”,在第二个术语列表中添加“灰色”和“铜”会破坏所有过滤。 我想我在这里只是需要一点方向

【问题讨论】:

  • 我已经更新了问题以包括我在过滤查询方面的进展,如果有人可以给我任何指示以继续前进的话。那太好了
  • 我找到了解决方法,我会尽快更新完整的解决方案

标签: c# elasticsearch nest


【解决方案1】:

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

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)
        )
    )
);

【讨论】:

  • 这比我想出的复杂解决方案还要好,谢谢 Russ
  • 关于范围的另一个问题@Russ Cam 是否可以自动生成,例如我总是想要 6 个选项,但它会根据退回产品的价格而变化,例如,如果最昂贵,它会像上面一样项目说 300 但如果最昂贵的项目说 1000 范围可能是 0-200 200-400 400-600 600-800 800-1000
  • 我不知道自动生成范围的方法,至少不知道与查询匹配的数据的最小值和最大值。您想以这种方式更改范围吗?这不会使 UI 混乱吗?滑块在这里会更好吗?
  • 我们当前的界面类似于argos.co.uk/browse/technology/video-games-and-consoles/xbox-one/… 有没有一种方法可以获取最小值和最大值,然后从中构建范围
  • 我已经做了一个单独的查询,并预先根据最大值预先构建了范围
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多