找出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的查询,以便我可以诊断我遇到的问题?

找出ElasticLinq实际上在做什么

如果您安装了Fiddler,您可以看到发送和返回的确切HTTP。或者您可以使用:

  1. .ToQueryInfo()方法并检查。body和。uri属性
  2. 用于捕获原始查询和响应的ILog接口

我想问题是CLR对象和文档字段名之间的映射——默认情况下ElasticMapping类——大小写字段名,并尝试将类型名复数化。您可以使用构造函数开关关闭此功能,或者根据您自己的特定约定创建它的子类。

另外,我认为你的查询应该说|| for OR和&&for AND—除了|和&