运行 使用 Nest 进行弹性搜索原始查询
Run elastic search raw query with Nest
我正在尝试 运行 在弹性搜索上使用 Nest.Net 库进行原始查询。
查询如下:
var json4 = @"
{
""query"": {
""bool"": {
""filter"":{
""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}
},
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
{
searchRequest = client.RequestResponseSerializer.Deserialize<SearchRequest>(stream);
}
反序列化方法引发如下错误:
无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.IEnumerable`1[Nest.QueryContainer]',因为该类型需要一个 JSON 数组(例如 [1,2,3]) 以正确反序列化。
要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是原始类型像整数,而不是像数组或列表这样的集合类型),可以从 JSON 对象反序列化。也可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。
路径 'query.bool.filter.term',第 6 行,位置 51。
查询在 kibana 中 运行ning 就好了。
谢谢
NEST 反序列化仅支持长形式的查询,即
bool
查询filter
子句必须是查询数组;它不支持传递对象的键是查询的对象
不支持 term
查询 "term": { "field": "value" }
的缩写;它必须是 "term": { "field" : { "value": "value" } }
. 的形式
以下方法可行
var json4 = @"
{
""query"": {
""bool"": {
""filter"":[
{ ""term"":{ ""schoolId"": { ""value"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}} }
],
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
{
searchRequest = client.Serializer.Deserialize<SearchRequest>(stream);
}
BUT,NEST 能够接受查询作为 JSON 字符串并返回强类型搜索响应使用低级客户端公开为 .LowLevel
属性。有了这个,就不需要将 JSON 字符串反序列化为 SearchRequest
,只需在提交请求时序列化回 JSON。此外,您可以使用您拥有的原始查询
var json4 = @"
{
""query"": {
""bool"": {
""filter"": {
""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503"" }
},
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
client.LowLevel.Search<SearchResponse<object>>("index", "type", json4);
我正在尝试 运行 在弹性搜索上使用 Nest.Net 库进行原始查询。 查询如下:
var json4 = @"
{
""query"": {
""bool"": {
""filter"":{
""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}
},
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
{
searchRequest = client.RequestResponseSerializer.Deserialize<SearchRequest>(stream);
}
反序列化方法引发如下错误:
无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.IEnumerable`1[Nest.QueryContainer]',因为该类型需要一个 JSON 数组(例如 [1,2,3]) 以正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是原始类型像整数,而不是像数组或列表这样的集合类型),可以从 JSON 对象反序列化。也可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。 路径 'query.bool.filter.term',第 6 行,位置 51。
查询在 kibana 中 运行ning 就好了。
谢谢
NEST 反序列化仅支持长形式的查询,即
bool
查询filter
子句必须是查询数组;它不支持传递对象的键是查询的对象
不支持 term
查询"term": { "field": "value" }
的缩写;它必须是"term": { "field" : { "value": "value" } }
. 的形式
以下方法可行
var json4 = @"
{
""query"": {
""bool"": {
""filter"":[
{ ""term"":{ ""schoolId"": { ""value"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}} }
],
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
{
searchRequest = client.Serializer.Deserialize<SearchRequest>(stream);
}
BUT,NEST 能够接受查询作为 JSON 字符串并返回强类型搜索响应使用低级客户端公开为 .LowLevel
属性。有了这个,就不需要将 JSON 字符串反序列化为 SearchRequest
,只需在提交请求时序列化回 JSON。此外,您可以使用您拥有的原始查询
var json4 = @"
{
""query"": {
""bool"": {
""filter"": {
""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503"" }
},
""must"": [
{
""multi_match"": {
""query"": ""001 Ali"",
""fields"": [""firstName"",""lastName"", ""phoneNumber"", ""code"", ""title""],
""type"": ""cross_fields""
}
}
]
}
}
}
";
client.LowLevel.Search<SearchResponse<object>>("index", "type", json4);