【问题标题】:ElasticSearch - Filtering the typeElasticSearch - 过滤类型
【发布时间】:2017-06-10 04:36:23
【问题描述】:

我已将我的 elasticsearch 从 v1.9 升级到 v5,我注意到很多事情都发生了变化。

如果我以 v1.9 为例:以下代码检查对象类型是否与 ObjectAdo 匹配,并过滤 ObjectAdo 中具有 IsDeleted 字段为 false 的项目。

private Func<FilterDescriptor<dynamic>, FilterContainer> Filter()
        {
            return b => b.Bool(x => x.Must(m => m.Type(typeof(ObjectAdo)), n => n.Term("IsDeleted", false)));
        }

现在,从 v1.9 升级到 v5 后,我注意到 FilterDescriptor 更改为 QueryContainerDescriptor 并且 FilterContainer 现在是 QueryContainer。现在我无法执行与以前相同的操作,因为.Type(typeof(ObjectAdo) 不再可用。

所以我想知道是否有替代解决方案来检查对象类型。

https://i.stack.imgur.com/dOPex.png

【问题讨论】:

    标签: c# .net elasticsearch nest


    【解决方案1】:

    在 Elasticsearch 2.0 中,queries and filters merged into one,具有查询上下文和过滤上下文的概念;当包装在 bool 查询过滤器子句中时,查询/过滤器位于过滤器上下文中,因此不会计算相关性分数并且可以缓存。

    NEST 2.x 及更高版本与 Elasticsearch 2.0 中的变化保持一致,并具有可用于查询和过滤上下文的查询(QueryContainerQueryContainerDescriptor&lt;T&gt; 等)。

    将此应用于您的过滤器,意味着使用 NEST 5.x 将其更改为以下内容

    private Func<QueryContainerDescriptor<dynamic>, QueryContainer> Filter()
    {
        return b => b.Bool(x => x
            .Filter(
                f => f.Type(t => t.Value(typeof(ObjectAdo))),
                f => f.Term("IsDeleted", false)
            )
        );
    }
    

    syntax for a type query has changed a little 采用 lambda 表达式来设置可用选项。

    【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多