具有多个 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 查询。