我已经通过控制台解决了我需要的elasticsearch查询,并且它按预期工作:
"query": {
"bool": {
"must": [
{ "terms": { "color": ["red", "blue"]
}
},
{ "match": { "availability": "in stock" }}
]
}
}
我现在需要使用嵌套客户端执行此操作。我目前已经尝试过:
nestClient.Search<Item>(
s => s.From(query.Page).Size(query.PageSize)
.Query(
q => q.Bool(
b => b.Must(
ss => ss.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)),
ss => ss.Match(m => m.Field(f => f.Availability == "in stock"))))).TypedKeys(null));
但是当在提琴手中查看输出的JSON时,它似乎正在忽略查询并使用:
{"from":0,"size":24}
如果我删除了嵌套查询的match
部分,则使用条件查询正确输出了JSON DSL。
可以一口气完成我想要的吗?
答案 0 :(得分:2)
match
query的查询值需要传递给.Query(...)
方法
var query = new {
Page = 0,
PageSize = 10,
Color = new [] { "red", "yellow" }
};
nestClient.Search<Item>(s => s
.From(query.Page)
.Size(query.PageSize)
.Query(q => q
.Bool(b => b
.Must(
ss => ss.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)),
ss => ss.Match(m => m.Field(f => f.Availability).Query("in stock"))
)
)
)
.TypedKeys(null)
);
可以使用operator overloading on the base query type进一步缩短此时间,以更简洁地构建bool
查询
nestClient.Search<Item>(s => s
.From(query.Page)
.Size(query.PageSize)
.Query(q => q
.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)) && q
.Match(m => m.Field(f => f.Availability).Query("in stock"))
)
.TypedKeys(null)
);
两者都会产生以下查询
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"terms": {
"color": [
"red",
"yellow"
]
}
},
{
"match": {
"availability": {
"query": "in stock"
}
}
}
]
}
}
}
另外,对于像terms
这样的term-level queries查询,查询的答案通常为是或否,例如这个词是否完全匹配,该数字是否在此数字范围内,等等。使用这样的谓词,您通常不需要为这些查询执行相关性计分阶段,而可以通过在{ {1}}上下文,例如filter
查询的filter子句。将其与运算符重载一起
bool
产生
nestClient.Search<Item>(s => s
.From(query.Page)
.Size(query.PageSize)
.Query(q => q
.Terms(t => t.Field(f => f.Color).Terms<string>(query.Color)) && +q
.Match(m => m.Field(f => f.Availability).Query("in stock"))
)
.TypedKeys(null)
);