Elasticsearch.Net - 从v1.9升级到v5.4后的更改

时间:2017-07-04 18:47:58

标签: c# .net elasticsearch nest

我已经注意到ES从v1.9升级到v5.4后发生了很多变化。

我仍然怀疑ES中的查询技术。在v1.9中,我注意到Filter选项不同。

我想知道如何在v5.4中复制以下代码

searchDescriptor.Query(q => q.Filtered(m => m.Query(n => matchQuery).Filter(o => o.And(filterContainer.ToArray()))))

在此,我看到Filter(o => o.And(filterContainer.ToArray())如何使用v5.4执行AndOr操作?

Filter(o => o.And(filterContainer.ToArray())是否表示数组中的每个项目都与And operaton绑定?

1 个答案:

答案 0 :(得分:1)

.And().Or()在Elasticsearch 2.0中已弃用,已在5.0中删除。您可以使用bool query

替换它们
  • 代表.And(),如果您需要评分,则使用.Must()。如果您不需要评分,请使用.Filter()
  • 代表.Or(),请使用.Should()

bool查询可以嵌套,因此可以创建复杂的复合查询。

  

searchDescriptor.Query(q =&gt; q.Filtered(m =&gt; m.Query(n =&gt; matchQuery).Filter(o =&gt; o.And(filterContainer.ToArray()))))< / p>

变得类似

var matchQuery = new MatchQuery { Field = "field", Query = "query" };

var filterContainer = new QueryContainer[] {
    new TermQuery { Field = "field", Value = "value" }
};

client.Search<Message>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(matchQuery)
            .Filter(filterContainer)
        )
    )
);

已过滤的查询已在2.0中弃用,并已在5.0中删除。

  

在这里,我看到Filter(o =&gt; o.And(filterContainer.ToArray())如何用v5.4进行And或Or操作?

     

Filter(o =&gt; o.And(filterContainer.ToArray())是否指示数组中的每个项目都与And operaton绑定?

对于这些,将它们传递给bool查询过滤器子句,这些子句是连接的,即“和”。如果您需要or子句,则可以使用bool查询子句中的过滤子句嵌套bool个查询。