5

我试图模仿我在 C# 中使用 NEST 在 Sense(chrome 插件)中编写的查询。我无法弄清楚这两个查询之间的区别是什么。Sense 查询返回记录,而嵌套查询不返回。查询如下:

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

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

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

4

3 回答 3

6

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

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

然后你可以比较输出。

于 2015-04-01T09:51:49.843 回答
6

我更喜欢这个稍微简单的版本,我通常只在 .NET 即时窗口中输入:

searchResults.ConnectionStatus;

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

? searchResults.ConnectionStatus;
{StatusCode: 200, 
    Method: POST, 
    Url: http://localhost:9200/_all/filecontent/_search, 
    Request: {
  "query": {
    "term": {
      "fileContents": {
        "value": "int"
      }
    }
  }
}
于 2015-07-06T13:50:56.547 回答
4

尝试这个:

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

跟进:

  1. RequestInformation在较新版本的 NEST 中不可用。
  2. 我建议逐步分解您的代码(不要直接在 client.Search() 方法中构建查询。

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

我在类似帖子中的回答:

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。较新的版本可能有更简单的方法来获得这个(希望如此)。

于 2017-04-14T18:14:16.513 回答