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:
RequestInformation
is not available in newer versions of NEST.
- 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。
较新的版本可能有更简单的方法来获得这个(希望如此)。
我正在尝试使用 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:
RequestInformation
is not available in newer versions of NEST.- 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。 较新的版本可能有更简单的方法来获得这个(希望如此)。