找出ElasticLinq实际上在做什么

时间:2014-06-21 01:30:39

标签: c# .net linq elasticsearch elasticlinq

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

1 个答案:

答案 0 :(得分:4)

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

  1. .ToQueryInfo()方法并检查.Body和.Uri属性
  2. ElasticContext上的ILog接口,用于捕获原始查询和响应
  3. 我认为问题在于CLR对象和文档字段名称之间的映射 - 默认情况下是ElasticMapping类camel-cases字段名称并尝试复数类型名称。您可以使用构造函数开关将其关闭,或者将其子类化为您自己的特定约定。

    此外,我认为您的查询应该说||对于OR和&amp;&amp;对于AND - 支持这些布尔运算符但是|和&amp;按位运算不是。