一尘不染

ElasticSearch-过滤类型

elasticsearch

我已经将我的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更改为QueryContainerDescriptorFilterContainer现在QueryContainer。现在,由于.Type(typeof(ObjectAdo)不再可用,我无法执行与以前相同的操作。

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

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


阅读 243

收藏
2020-06-22

共1个答案

一尘不染

在Elasticsearch
2.0中,查询和过滤器合并为一个,其中包含查询上下文和过滤器上下文的概念;当包装在布尔查询过滤器子句中时,查询/过滤器位于过滤器上下文中,因此不会计算相关性得分,并且可以缓存。

NEST 2.X与Elasticsearch
2.0的变化起对准并具有查询(QueryContainerQueryContainerDescriptor<T>,等),可以在查询和过滤器的环境中使用。

将其应用于您的过滤器,意味着使用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)
        )
    );
}

查询语法稍有type变化,采用了lambda表达式来设置可用选项。

2020-06-22