具有多个 must 子句的 Elasticsearch Nest 查询 bool 过滤器
Elasticsearch Nest query bool filter with multiple must clauses
我有这个 elasticsearch 查询,它在原始格式下运行完美,但我无法将其转换为 C# NEST 子句。
这是原始查询:
{
"query":{
"constant_score":{
"filter":{
"bool":{
"must":{
"term":{
"ingredients":"baking"
}
},
"must":{
"term":{
"ingredients":"soda"
}
}
}
}
}
}
}
这就是我认为在 C# NEST 中可行的方法:
public List<Recipe> FindByMultipleValues(string field, string[] values) {
List<string> vals = values.ToList();
return client.Search<Recipe>(s => s
.Query(q => q
.Bool(fq => fq
.Filter(f => f
.Term(rec => rec.Ingredients, vals)
)
)
)
).Documents.ToList();
}
用户可以发送一个 x 值数组,这意味着对于每个值必须有一个:
"must":{
"term":{
"ingredients":"soda"
}
}
像这样的东西会起作用
var terms = new[] { "baking", "soda" };
client.Search<Recipe>(s => s
.Query(q => q
.ConstantScore(cs => cs
.Filter(csf =>
{
var firstTerm = csf.Term(f => f.Ingredients, terms.First());
return terms.Skip(1).Aggregate(firstTerm, (query, term) => query && csf.Term(f => f.Ingredients, term));
})
)
)
);
将产生
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"term": {
"ingredients": {
"value": "baking"
}
}
},
{
"term": {
"ingredients": {
"value": "soda"
}
}
}
]
}
}
}
}
}
这利用了 operator overloading for QueryContainer
的优势,允许将它们 &&
组合在一起形成带有 must
子句的 bool
查询。
我有这个 elasticsearch 查询,它在原始格式下运行完美,但我无法将其转换为 C# NEST 子句。
这是原始查询:
{
"query":{
"constant_score":{
"filter":{
"bool":{
"must":{
"term":{
"ingredients":"baking"
}
},
"must":{
"term":{
"ingredients":"soda"
}
}
}
}
}
}
}
这就是我认为在 C# NEST 中可行的方法:
public List<Recipe> FindByMultipleValues(string field, string[] values) {
List<string> vals = values.ToList();
return client.Search<Recipe>(s => s
.Query(q => q
.Bool(fq => fq
.Filter(f => f
.Term(rec => rec.Ingredients, vals)
)
)
)
).Documents.ToList();
}
用户可以发送一个 x 值数组,这意味着对于每个值必须有一个:
"must":{
"term":{
"ingredients":"soda"
}
}
像这样的东西会起作用
var terms = new[] { "baking", "soda" };
client.Search<Recipe>(s => s
.Query(q => q
.ConstantScore(cs => cs
.Filter(csf =>
{
var firstTerm = csf.Term(f => f.Ingredients, terms.First());
return terms.Skip(1).Aggregate(firstTerm, (query, term) => query && csf.Term(f => f.Ingredients, term));
})
)
)
);
将产生
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"term": {
"ingredients": {
"value": "baking"
}
}
},
{
"term": {
"ingredients": {
"value": "soda"
}
}
}
]
}
}
}
}
}
这利用了 operator overloading for QueryContainer
的优势,允许将它们 &&
组合在一起形成带有 must
子句的 bool
查询。