使用 NEST 的 Elasticsearch - 无结果

Elasticsearch using NEST - No Results

我正在尝试在 Elasticsearch 中进行简单的搜索。

令人惊奇的是,我使用以下查询得到了结果:

    GET /gl_search/poc/_search
{
  "query": {

    "term": {
      "Account_No": "056109"
    }
  }
}

类型是poc,索引是gl_search。见下文

{
   "took": 28,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 23586,
      "max_score": 4.7722025,
      "hits": [
         {
            "_index": "gl_search",
            "_type": "poc",
            "_id": "AU7fza_MU2-26YcvKIeM",


        var node = new Uri("http://localhost:9200");

        var settings = new ConnectionSettings(
            node,
            defaultIndex: "gl_search"
        );

使用 NEST 时,我没有得到任何结果。我尝试了以下方法:

        var r = client.Search<poc>(s => s
                    .From(0)
                    .Size(10)
                    .Query(q => q
                        .Term(p => p.Account_No, "056109")


            )

        var r = client.Search<poc>(query => query.Index("gl_search")
           .Type("poc")
           .From(0)
           .Size(100)
           .Filter(x => x.Term(p=> p.Journal_ID, "056109")));

设置为:

        var node = new Uri("http://localhost:9200");

        var settings = new ConnectionSettings(
            node,
            defaultIndex: "gl_search"
        );

更新

我在 Fiddler 中没有看到任何东西。我想我会在那里看到一些东西。如果是这样,是我设置的方式还是某种病毒防护阻止了它

正如评论中所指出的,在将 SearchDescriptor<T> 序列化到查询 DSL 中时,NEST 默认情况下会驼峰命名 .NET 对象 属性 名称。所以,在你上面的例子中,

void Main()
{
    var settings = new ConnectionSettings(new Uri("http://localhost:9200"));
    var connection = new InMemoryConnection(settings);
    var client = new ElasticClient(connection: connection);

    var r = client.Search<poc>(s => s
                .Index("gl_search")
                .From(0)
                .Size(10)
                .Query(q => q
                   .Term(p => p.Account_No, "056109")
                )
            );
    Console.WriteLine(Encoding.UTF8.GetString(r.RequestInformation.Request));
}

生成以下查询 DSL(注意 属性 是 account_No

{
  "from": 0,
  "size": 10,
  "query": {
    "term": {
      "account_No": {
        "value": "056109"
      }
    }
  }
}

现在,有两个真正的选择可以解决这个问题

1.Use 属性 名称的字符串,绕过 NEST 的驼峰式命名约定,但以不使用 lambda 表达式和它们提供的所有类型安全为代价

var r = client.Search<poc>(s => s
            .Index("gl_search")
            .From(0)
            .Size(10)
            .Query(q => q
               .Term("Account_No", "056109")
            )
        );

2.Change NEST 的默认序列化选项;如果您的所有属性都按照您的示例进行大小写,则很有用

    // change the default camelcase property name serialization 
    // behaviour with .SetDefaultPropertyNameInferrer
    var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
        .SetDefaultPropertyNameInferrer(s => s);

    var client = new ElasticClient(settings);

    var r = client.Search<poc>(s => s
                .Index("gl_search")
                .From(0)
                .Size(10)
                .Query(q => q
                   .Term(p => p.Account_No, "056109")
                )
            );

A Func<string, string> 被传递给 .SetDefaultPropertyNameInferrer(),它将为每个 属性 调用,将被序列化以形成发送到 Elasticsearch 的 json 查询 DSL。