繁体   English   中英

Elasticsearch NEST 5.x动态构建的搜索查询

[英]Elasticsearch NEST 5.x Search Query that is built dynamically

我有以下查询,我使用“&=”逐个/动态构建。 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)针对旧版本导致错误出现。 清理解决方案并重建修复它。

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

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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM