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

标签 elasticsearch nest

我有以下查询,我使用“&=”来逐步/动态地构建。 Elasticsearch 5.x和Nest5.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接受我建立的查询。在线示例显示“搜索+查询”与我要完成的功能不同。以下是我想要避免的常见示例:
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"))
        )
    );

编辑:使用Andrey的答案就可以了。但是,当我尝试从搜索查询中获取结果时会出现问题:
List<ClassViewEL> listDocuments = response.Documents.ToList();

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

error CS0570: 'Nest.ISearchResponse.Documents' is not supported by the language



调试并选择 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));
}

关于elasticsearch - 动态构建的Elasticsearch NEST 5.x搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124247/

相关文章:

elasticsearch - NEST elasticsearch DateRange查询

node.js - Node.js环境下mongodb与elasticsearch的集成

elasticsearch - Logstash 是否可以将相同的内容从日志文件推送到 ElasticSearch

Spring Data Elasticsearch 需要名为 id 的属性

c# - 不能在 Elasticsearch 中使用字符串作为 _id 的值

swift - 为什么要使用嵌套类?

elasticsearch - 如何从搜索中返回有限的字段?

elasticsearch - Kibana如何知道(Elasticsearch)数据类型支持的聚合?

elasticsearch - 如何在 Elasticsearch 中部分匹配多个单词的通配符查询?

nest - 如何在 Elasticsearch.Net (NEST) 中将 POCO 与字段一起使用?