inv*_*e27 1 elasticsearch nest
我有以下查询,我使用“&=”逐步/动态地构建。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 ***
Run Code Online (Sandbox Code Playgroud)
在 Visual Studio 中,它显示以下错误消息提示:
Error: Cannot convert from 'Nest.QueryContainer' to 'System.Func<Nest.QueryContainerDescriptor<ClassEL>, Nest.QueryContainer>'
Run Code Online (Sandbox Code Playgroud)
问题是我无法让 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"))
)
);
Run Code Online (Sandbox Code Playgroud)
编辑:使用安德烈的答案效果很好。然而,当我尝试从搜索查询中获取结果时,出现了问题:
List<ClassViewEL> listDocuments = response.Documents.ToList();
Run Code Online (Sandbox Code Playgroud)
Visual Studio 不会立即将其突出显示为错误,但在编译时会出现问题:
错误 CS0570:该语言不支持“Nest.ISearchResponse<Website.Common.BizServiceViewEL>.Documents”
调试并选择忽略上述错误效果很好,代码按预期执行,没有问题。然而,编译时错误将阻止代码部署。如何修复此错误?
编辑解决方案:我的项目中的依赖项之一(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);
Run Code Online (Sandbox Code Playgroud)
或者像这样
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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |