我试图使用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"
}
}
}
这两个查询有什么区别?为什么一个人会返回记录而另一个没有?
答案 0 :(得分:6)
您可以使用以下代码找出NEST使用的查询:
var json = System.Text.Encoding.UTF8.GetString(searchResults.RequestInformation.Request);
然后你可以比较输出。
答案 1 :(得分:6)
我更喜欢这个稍微简单的版本,我通常只在.NET立即窗口中输入:
searchResults.ConnectionStatus;
除了缩短之外,它还提供了网址,这可能非常有用。
? searchResults.ConnectionStatus;
{StatusCode: 200,
Method: POST,
Url: http://localhost:9200/_all/filecontent/_search,
Request: {
"query": {
"term": {
"fileContents": {
"value": "int"
}
}
}
}
答案 2 :(得分:4)
试试这个:
var searchResults2 = client.Search<File>(s => s
.Query(q => q
.Term(p => p.Field(r => r.fileContents).Value("int")
)
));
跟进:
RequestInformation
在较新版本的NEST中不可用。- 我建议分步你的代码(不要直接在client.Search()方法中构建查询。
醇>
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。 较新的版本可能有一个更简单的方法来获得这个(希望)。