找出ElasticLinq实际上在做什么
本文关键字:什么 实际上 ElasticLinq 找出 | 更新日期: 2023-09-27 18:09:43
我有一个ElasticDatastore
,我需要能够根据业务逻辑中的任意标准返回文档列表。
方法当前看起来像这样…
private ElasticContext esLinq;
private void initialise() {
esLinq = new ElasticContext(new ElasticConnection(endpoint, index: index));
}
public IEnumerable<Entities.Item> Items(Func<Entities.Item, bool> predicate) {
var ret = esLinq.Query<Item>().Where(predicate);
return ret;
}
我这样称呼它
var newItems = dataStore.Items(x=>
x.SomeField == node.SomeValue.ToString()
& (x.AssignedTo == null
| x.AssigmentExpires < DateTime.UtcNow)
).ToList();
就目前情况而言,该方法返回零结果。通过使用弹性头(和卷曲),我可以验证是否有文档符合索引中指定的标准。
我的第一个猜测是EsLinq预期的字段名不正确(大小写…该索引是使用nest构建的。然而,我找不到一个好的方法来检查EsLinq实际发送给elasticsearch的内容。
I can do
esLinq.Query<Item>().ToElasticSearchQuery();
并获得一个json字符串,表示(空白)查询,然而,...Query<Item>().Where(predicate)
返回一个没有ToElasticSearchQuery
扩展的IEnumerable<Item>
。
编译器接受
ret.AsQueryable().ToElasticSearchQuery()
,但我得到一个ArgumentException
在运行时:
Query must be of type IElasticQuery<> to call ToElasticSearchQuery()
我如何检查EsLinq发送到elasticsearch的查询,以便我可以诊断我遇到的问题?
如果您安装了Fiddler,您可以看到发送和返回的确切HTTP。或者您可以使用:
- .ToQueryInfo()方法并检查。body和。uri属性
- 用于捕获原始查询和响应的ILog接口
我想问题是CLR对象和文档字段名之间的映射——默认情况下ElasticMapping类——大小写字段名,并尝试将类型名复数化。您可以使用构造函数开关关闭此功能,或者根据您自己的特定约定创建它的子类。
另外,我认为你的查询应该说|| for OR和&&for AND—除了|和&