【问题标题】:Elasticsearch NEST 5.x Search Query that is built dynamically动态构建的 Elasticsearch NEST 5.x 搜索查询
【发布时间】:2017-11-05 17:05:15
【问题描述】:

我有以下查询,我使用“&=”零碎/动态构建。 Elasticsearch 5.x 和 Nest 5.x。

QueryContainer qfilter = null;

qfilter = Query<ClassEL>.Term(m => m.OrderID, iOrderID);

qfilter &= Query<ClassEL>
.Range(r => r
  .Field(f => f.Distance)
  .GreaterThan(100))
&&
.Query<ClassEL>.Term(t => t.Active, true);

 var searchDes = new SearchDescriptor<ClassEL>()
 .From(0)
 .Size(10)
 .Query(qfilter);  <===== *** ERROR HERE ***

在 Visual Studio 中,它显示以下错误消息提示:

Error: Cannot convert from 'Nest.QueryContainer' to 'System.Func<Nest.QueryContainerDescriptor<ClassEL>, Nest.QueryContainer>'

问题是我无法让 searchDescriptor 接受我构建的查询。在线示例显示 Search + Query 合二为一,这与我想要完成的不同。以下是我想避免的常见示例:

var response = client.Search<Tweet>(s => s
    .From(0)
    .Size(10)
    .Query(q =>
            q.Term(t => t.User, "kimchy")
            || q.Match(mq => mq.Field(f => f.User).Query("nest"))
        )
    );

编辑:使用安德烈的答案就可以了。但是,当我尝试从搜索查询中获取结果时出现了问题:

List<ClassViewEL> listDocuments = response.Documents.ToList();

Visual Studio 不会立即将其突出显示为错误,但在编译时出现问题:

错误 CS0570: 'Nest.ISearchResponse.Documents' 是 语言不支持

调试并选择IGNORE上述错误工作正常,代码按预期执行没有问题。但是编译时错误会阻止代码部署。如何解决此错误?

解决方案 编辑:我的项目 (Newtonsoft.Json.dll) 中的一个依赖项针对的是旧版本,导致出现错误。清理解决方案并重建解决方案。

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    您应该使用Func&lt;SearchDescriptor&lt;ClassEL&gt;, ISearchRequest&gt; 或在单独的方法中传递描述符。例如:

    var queryContainer = Query<ClassEL>.Term(x => x.Field(f => f.FirstName).Value("FirstName"));
    queryContainer &= Query<ClassEL>.Term(x => x.Field(f => f.LastName).Value("LastName"));
    
    Func<SearchDescriptor<ClassEL>, ISearchRequest> searchFunc = searchDescriptor => searchDescriptor
                                                                                            .Index("indexName")
                                                                                            .Query(q => queryContainer);
    
    var response = _client.Search<ClassEL>(searchFunc);
    

    或者像这样

    ISearchRequest ExecuteQuery(SearchDescriptor<ClassEL> searchDescriptor, QueryContainer queryContainer)
    {
        return searchDescriptor.Index("indexName")
            .Query(q => queryContainer);
    }
    
    public void GetResults()
    {
        var queryContainer = Query<ClassEL>.Term(x => x.Field(f => f.FirstName).Value("FirstName"));
        queryContainer &= Query<ClassEL>.Term(x => x.Field(f => f.LastName).Value("LastName"));
    
        var response = _client.Search<ClassEL>(s => ExecuteQuery(s, queryContainer));
    }
    

    【讨论】:

    • 请在问题末尾查看我的编辑。你遇到过同样的错误吗?
    • 这是一个关于编译的不同问题。我没有这样的问题,但已经讨论过here。可能有帮助
    • 这正是问题所在,感谢您指出正确的方向
    猜你喜欢
    • 2021-05-02
    • 2017-04-04
    • 1970-01-01
    • 2019-08-11
    • 2021-12-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多