【问题标题】:Elasticsearch.Net - Changes after upgrading from v1.9 to v5.4Elasticsearch.Net - 从 v1.9 升级到 v5.4 后的变化
【发布时间】:2017-12-08 07:24:27
【问题描述】:

我注意到 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 操作?

【问题讨论】:

    标签: c# .net elasticsearch nest


    【解决方案1】:

    .And().Or() 在 Elasticsearch 2.0 中被弃用并在 5.0 中被删除。您可以将它们替换为bool query

    • 对于.And(),如果需要评分,则使用.Must()。如果您不需要评分,请使用.Filter()
    • 对于.Or(),使用.Should()

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

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

    变成类似

    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 => o.And(filterContainer.ToArray()) 如何使用 v5.4 进行 And 或 Or 操作?

    Filter(o => o.And(filterContainer.ToArray())是否表示数组中的每一项都绑定了一个And操作?

    对于这些,将它们传递给bool 查询过滤子句,这些子句是连词的,即与。如果您需要 or 子句,您可以在 bool 查询 should 子句中嵌套带有过滤子句的 bool 查询。

    【讨论】:

    • 谢谢。很有意义。对于.Missing().Not() 来说,ES 5 有什么新东西吗?非常感谢您的回复。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多