ElasticSearch 嵌套查询

ElasticSearch NEST Query

我正在尝试使用 C# 中的 NEST 模拟我在 Sense(chrome 插件)中编写的查询。我无法弄清楚这两个查询之间的区别是什么。 Sense 查询 returns 记录而 nest 查询没有。查询如下:

var searchResults = client.Search<File>(s => s.Query(q => q.Term(p => p.fileContents, "int")));

{
"query": {
    "term": {
       "fileContents": {
          "value": "int"
       }
    }
}

这两个查询有什么区别?为什么一个 return 记录而另一个不记录?

您可以通过以下代码了解 NEST 使用的查询:

var json = System.Text.Encoding.UTF8.GetString(searchResults.RequestInformation.Request);

然后你可以比较输出。

我更喜欢这个稍微简单一点的版本,我通常只输入 .NET Immediate window:

searchResults.ConnectionStatus;

除了更短之外,它还提供了 url,这非常有帮助。

? searchResults.ConnectionStatus;
{StatusCode: 200, 
    Method: POST, 
    Url: http://localhost:9200/_all/filecontent/_search, 
    Request: {
  "query": {
    "term": {
      "fileContents": {
        "value": "int"
      }
    }
  }
}

试试这个:

var searchResults2 = client.Search<File>(s => s
    .Query(q => q
        .Term(p => p.Field(r => r.fileContents).Value("int")
    )
));

Followup:

  1. RequestInformation is not available in newer versions of NEST.
  2. I'd suggest breaking down your code in steps (Don't directly build queries in client.Search() method.

client.Search() 将 Func<SearchDescriptor<T>, ISearchRequest> 作为输入(参数)。

我的回答来自similar post

SearchDescriptor<T> sd = new SearchDescriptor<T>()
.From(0).Size(100)
    .Query(q => q
        .Bool(t => t
            .Must(u => u
                .Bool(v => v
                    .Should(
                        ...
                    )
                )
            )
        )
    );

并得到了这样的反序列化 JSON:

{
  "from": 0,
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              ...
            ]
          }
        }
      ]
    }
  }
}

这很烦人,NEST 库应该有一些东西可以从请求中吐出 JSON。然而这对我有用:

using (MemoryStream mStream = new MemoryStream()) {
    client.Serializer.Serialize(sd, mStream);
    Console.WriteLine(Encoding.ASCII.GetString(mStream.ToArray()));
}

NEST 库版本:2.0.0.0。 较新的版本可能有更简单的方法来获得这个(希望如此)。