Elasticsearch Nest 5 QueryContainer的行为有所不同

时间:2017-07-06 08:08:05

标签: elasticsearch nest

从Nest 1.7升级到5后,我创建查询类的模式不再适用,我想知道是否有人可以指出为什么或如何更改它以便它可以。

首先,我有一个我的查询类继承自的基类:

public abstract class BaseSearchQuery<T> : SearchDescriptor<T>
    where T : class
{
    protected QueryContainer SearchQueryContainer;

    protected void AndQuery(QueryContainer query)
    {
        SearchQueryContainer = SearchQueryContainer == null 
                ? query
                : SearchQueryContainer && query;
    }

    protected abstract SearchDescriptor<T> Build();
}

然后我会从这个类继承我想做的每个不同的查询:

public class SomeSearch : BaseSearchQuery<SomeType>
{
    public string SomeValue { get; set; }

    protected override SearchDescriptor<SomeType> Build()
    {
        return AddSomeValue()
            .Query(SearchQueryContainer);
    }

    private SomeSearch AddSomeValue()
    {
        AndQuery(new QueryDescriptor<SomeType>().Term(f => f.SomeField.Suffix("raw"), SomeValue));
        return this;
    }
}

自从升级NEST以来,这已不再适用,如果有人知道如何使这项工作或更好的方式,我会非常感激。

由于

1 个答案:

答案 0 :(得分:0)

  

从Nest 1.7升级到5后,我创建的查询类模式不再适用

它怎么不再有效?键入名称需要进行一些小的更改,但这可以正常工作

public abstract class BaseSearchQuery<T> : SearchDescriptor<T>
    where T : class
{
    protected QueryContainer SearchQueryContainer;

    protected void AndQuery(QueryContainer query)
    {
        SearchQueryContainer = SearchQueryContainer == null
                ? query
                : SearchQueryContainer && query;
    }

    protected abstract SearchDescriptor<T> Build();
}

public class SomeSearch : BaseSearchQuery<SomeType>
{
    public string SomeValue { get; set; }

    protected override SearchDescriptor<SomeType> Build()
    {
        return AddSomeValue()
            .Query(_ => SearchQueryContainer);
    }

    private SomeSearch AddSomeValue()
    {   
        AndQuery(new QueryContainerDescriptor<SomeType>().Term(f => f.SomeField.Suffix("raw"), SomeValue));
        return this;
    }
}

我并没有真正看到这个查询类模式真正为您提供的内容;我可以将它看作是一种封装从解决方案中不同位置调用的常见查询的方法,但也许Query<T>静态类方法可以在这里提供帮助,并将这些方法封装在特定POCO类型的静态类中,在不同的地方重复使用?

public class SomeType
{
    public string SomeField { get; set; }
}

public static class SomeTypeQueries
{
    public static QueryContainer SomeFieldRawTerm(string value) =>
        Query<SomeType>.Term(f => f.SomeField.Suffix("raw"), value);
}

var client = new ElasticClient(connectionSettings);

client.Search<SomeType>(s => s.Query(_ => SomeTypeQueries.SomeFieldRawTerm("term")));