我有一个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的查询,以便我可以诊断出我遇到的问题?
答案 0 :(得分:4)
如果安装Fiddler,您可以看到发送和返回的确切HTTP。或者,您可以使用:
我认为问题在于CLR对象和文档字段名称之间的映射 - 默认情况下是ElasticMapping类camel-cases字段名称并尝试复数类型名称。您可以使用构造函数开关将其关闭,或者将其子类化为您自己的特定约定。
此外,我认为您的查询应该说||对于OR和&amp;&amp;对于AND - 支持这些布尔运算符但是|和&amp;按位运算不是。