【问题标题】:NEST: Update source filterNEST:更新源过滤器
【发布时间】:2017-11-10 03:16:10
【问题描述】:

我有一个将查询作为参数的方法,例如:

public ISearchResponse<Object> SearchComponent(SearchDescriptor<Object> query)
{
...
}

在此查询中,我想添加一个源过滤器,例如:

public ISearchResponse<Object> SearchComponent(SearchDescriptor<Object> query)
{
query = query.Source(sf =>
                    sf.Exclude(e => e
                        .Field("SomeField")
                        ));
...
}

但是如果查询已经有源过滤器会发生什么?这个过滤器会覆盖那个过滤器吗?如何更新现有的查询源过滤器?

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    这似乎可行,但它不是最漂亮的解决方案。谁能想出更好的选择?

    public ISearchResponse<Object> SearchComponent(ISearchRequest query)
    {
        var excludeFields = new List<string>();
        excludeFields.Add("SomeField");
    
        if (query.Source == null)
        {
            query.Source = new SourceFilter {Include = "*", Exclude = excludeFields.ToArray()};
        }
        else if (query.Source.Exclude == null)
        {
            query.Source.Exclude = excludeFields.ToArray();
        }
        else
        {
            query.Source.Exclude.And(excludeFields.ToArray());
        }
        ...
    }
    

    【讨论】:

    • 由于演员阵容,这显然很糟糕。如果您的方法需要将query 视为ISearchRequest,您不妨将其用作方法的参数。此外,无需检查 excludeFields 是否有任何内容,因为您在此之前添加了一些内容。除此之外,您的解决方案似乎是一种可读的方法 - 您可以将其压缩为单行,但可读性较差(因此不受欢迎)
    • 演员阵容和是否有案例,因为这是对我现实生活案例的简化。我会相应地更新示例。
    • 如果您所做的只是添加一个字段(这不再是某种简化),那么创建一个列表就有点过头了。 query.Source.Exclude = new [] { "SomeField" } 可以。请记住 - 列表使用默认容量 16 进行初始化,而使用简单数组将只占用操作所需的空间。
    • 该列表在现实生活中可能更长...我看到的问题是,如果其他人已经为查询设置了过滤器,那么我需要更新查询而不是设置新过滤器。
    【解决方案2】:

    您使用的 Nest 版本比我的旧版本有所改变,但我认为您可以按照以下方式做一些事情:

    var exclude = query.Source?.Exclude; 
    query.Source = new SourceFilter() { Excludes =  (exclude ?? new Field[0]).Union(moreFields) };
    

    【讨论】:

    • 我尝试将我的解决方案升级到 5.x,但我不明白 Union 是如何工作的? :) 你能举个例子说明你在 5.x 中是如何做到的吗?
    • 很抱歉,我刚刚注意到您的评论。你还需要那个例子吗?
    • 是的,请! :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2023-03-15
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多