我有一个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的内容。
我可以
esLinq.Query<Item>().ToElasticSearchQuery();
并获得一个表示(空白)查询的json字符串,但是...Query<Item>().Where(predicate)
返回IEnumerable<Item>
没有ToElasticSearchQuery
扩展名的。
编译器接受
ret.AsQueryable().ToElasticSearchQuery()
但我ArgumentException
在运行时得到了:
Query must be of type IElasticQuery<> to call ToElasticSearchQuery()
如何检查EsLinq发送给Elasticsearch的查询,以便诊断出我遇到的问题?
如果安装Fiddler,则可以看到正在发送和返回的确切HTTP。另外,您可以使用:
我可以想象问题是您的CLR对象与文档字段名称之间的映射-默认情况下,ElasticMapping类使用驼峰式命名字段名称并尝试使类型名称复数。您可以使用构造函数开关将其关闭,也可以根据自己的特定约定将其子类化。
另外,我认为您的查询应该说||。对于OR和&&对于AND-支持这些布尔运算符,但| 和&按位运算不是。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句