elasticsearch,asp.net-web-api2,nest,C#,elasticsearch,Asp.net Web Api2,Nest" /> elasticsearch,asp.net-web-api2,nest,C#,elasticsearch,Asp.net Web Api2,Nest" />

C# 如何使用NEST准确表示ElasticSearch查询? 背景/目标

C# 如何使用NEST准确表示ElasticSearch查询? 背景/目标,c#,elasticsearch,asp.net-web-api2,nest,C#,elasticsearch,Asp.net Web Api2,Nest,我在ElasticSearch中有一个查询,我在几个字段相对较小的数据集上使用过滤器,我们知道在查询时这些字段中应该有什么值。我们的想法是,我们将执行全文查询,但只有在过滤了用户所做的一些选择之后 我将ElasticSearch放在WebAPI控制器后面,并认为使用NEST来完成查询是有意义的 用简单的英语回答这个问题 我们有几个字段的过滤器。每个内部过滤器都是or过滤器,但它们作为AND组合在一起 在SQL中,伪代码等价物是select*,其中foo在1,2,3中,bar在4,5,6中 问题

我在ElasticSearch中有一个查询,我在几个字段相对较小的数据集上使用过滤器,我们知道在查询时这些字段中应该有什么值。我们的想法是,我们将执行全文查询,但只有在过滤了用户所做的一些选择之后

我将ElasticSearch放在WebAPI控制器后面,并认为使用NEST来完成查询是有意义的

用简单的英语回答这个问题 我们有几个字段的过滤器。每个内部过滤器都是or过滤器,但它们作为AND组合在一起

在SQL中,伪代码等价物是select*,其中foo在1,2,3中,bar在4,5,6中

问题 根据您在下面看到的内容,我可以简化我对这个查询的思考方式吗?我是否忽略了一些基本方法?这看起来很重,但我是新手。 我如何正确地用嵌套语法表示下面的查询? NEST是最好的选择吗?我是否应该改用ElasticSearch库并降低级别? 查询文本
这种任务在ES中非常简单和流行。 您可以在嵌套中表示它,如下所示:

var rs = es.Search<dynamic>(s => s
            .Index("your_index").Type("your_type")
            .From(0).Size(100)
            .Query(q => q
                .Filtered(fq => fq
                    .Filter(ff => ff
                        .Bool(b => b
                            .Must(
                                m1 => m1.Terms("foo", new string[] { "something", "somethingElse" }),
                                m2 => m2.Terms("bar", new string[] { "something", "somethingElse" })
                            )
                        )
                    )
                    .Query(qq => qq
                        .MatchAll()
                    )
                )
            )
        );
然后replace.Boolb=>b.Must。。。with.Boolb=>b.Mustfilters.ToArray


希望能有所帮助

这是一个非常有帮助的起点-谢谢!如果我需要在飞行中计算m1和m2的数量呢?如中所示,可能有3个或1个,我必须根据传入的过滤器分别编写它们?必须定义中的空数组是匹配所有文档还是仅匹配那些字段为空的文档?再次感谢您迄今为止的出色回答。您可以先定义过滤器列表,然后将其传递给Bool,我更新了答案。对于空数组情况,它将被NEST抑制,并等于match all.FYI如果要查询具有空值的字段,可以尝试缺少筛选器。更新正是我需要看到的。非常感谢您花时间澄清。
var rs = es.Search<dynamic>(s => s
            .Index("your_index").Type("your_type")
            .From(0).Size(100)
            .Query(q => q
                .Filtered(fq => fq
                    .Filter(ff => ff
                        .Bool(b => b
                            .Must(
                                m1 => m1.Terms("foo", new string[] { "something", "somethingElse" }),
                                m2 => m2.Terms("bar", new string[] { "something", "somethingElse" })
                            )
                        )
                    )
                    .Query(qq => qq
                        .MatchAll()
                    )
                )
            )
        );
var filters = new List<Nest.FilterContainer>();
filters.Add(Nest.Filter<dynamic>.Terms("foo", new string[] { "something", "somethingElse" }));
// ... more filter