elasticsearch - 如何为以下 json 创建 Fluent DSL lambda 表达式
问题描述
我有 json,其中我有多个汽车模型和变体,现在我们需要根据对具有关联变体的汽车模型的请求动态创建查询。我下面有json。
我尝试创建查询,但不知道如何动态处理多个模型和变体请求。
var response = _esclient.EsClient().Search<ClassName>(a => a
.Index("Test")
.Type("Testa")
.Query(q => q.Bool(b =>
b.Must(m => m.Bool(p => p.Should(should =>
should.Bool(sb => sb.Must(m3 => m3.Term(t => t.Field(classname => classname.model).Value(modelname)) m3 => m3.Term(t => t.Field(classname => classname.model).Value(varientName)))))), should => should.Bool(sb => sb.Must(m1 => m1.Term(c => c.Field(classname => classname.variant).Value(varientname)), m1 => m1.Term(c => c.Field(classname => classname.model).Value(modelname))))
)))))
我已经为具有关联变体的两个模型静态创建了表达式。但我希望它动态地用于任意数量的模型和关联模型,因为我不知道会出现什么模型和关联的变体请求。4 个模型和相关变体请求的预期 Json。它可以根据要求增加或减少。
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"variant": "lxi"
}
},
{
"term": {
"model": "ritz"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": "lxi"
}
},
{
"term": {
"model": "alto"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": "lxi"
}
},
{
"term": {
"model": "omni"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": "vxi"
}
},
{
"term": {
"model": "alto 800"
}
}
]
}
}
]
}
}
]
}
}
}
解决方案
这不是一个真正的 Nest 问题。这是关于 C# lambda 表达式的使用,坦率地说有时会让人感到困惑。我将在下面展示适用于任意数量汽车的代码。但是您必须自己努力理解 lambda 表达式:)
internal class Program
{
private class Car
{
public string Model { get; set; }
public string Variant { get; set; }
}
private static void Main(string[] args)
{
ElasticClient esClient = new ElasticClient(new Uri("http://localhost:9200"));
List<Car> cars = new List<Car>
{
new Car
{
Model = "ritz",
Variant = "lxi"
},
new Car
{
Model = "alto",
Variant = "lxi"
},
new Car
{
Model = "omni",
Variant = "lxi"
},
new Car
{
Model = "alto 800",
Variant = "vxi"
}
};
ISearchResponse<object> response = esClient.Search<object>(a => new SearchDescriptor<object>()
.Index("index")
.Type("type")
.Query(q => q
.Bool(b => b
.Should(cars.Select<Car, Func<QueryContainerDescriptor<object>, QueryContainer>>(car =>
d => new TermQuery { Field = "variant", Value = car.Variant }
&& new TermQuery { Field = "model", Value = car.Model })))));
}
}
这将生成一个 Elasticsearch 搜索请求正文,这就是您想要的。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"variant": {
"value": "lxi"
}
}
},
{
"term": {
"model": {
"value": "ritz"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": {
"value": "lxi"
}
}
},
{
"term": {
"model": {
"value": "alto"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": {
"value": "lxi"
}
}
},
{
"term": {
"model": {
"value": "omni"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"variant": {
"value": "vxi"
}
}
},
{
"term": {
"model": {
"value": "alto 800"
}
}
}
]
}
}
]
}
}
}
推荐阅读
- r - ensemble_glmnet:找不到函数“predict.cv.glmnet”
- javascript - 反应:在渲染之外使用道具
- excel - 将表转换为列
- background - ExoPlayer 在 Galaxy S8 / Note8 (Android 9) 上无法在后台/睡眠模式下工作
- r - dplyr 0.7.7 二进制 R 3.3.3
- python - 使用 gevents Wsgi 服务器在一个进程中多次启动和停止烧瓶应用程序
- spring-boot - @Autowired 在方法上,该方法是在运行时随机执行的吗?
- node.js - 使用 axios 将数据发布到网站时遇到问题
- svn - 如何更新 SVN?
- django - Django 用户模型(用户到用户的关系)