gpt4 book ai didi

elasticsearch - 使用对象初始值设定项语法构建动态查询

转载 作者:行者123 更新时间:2023-11-29 02:56:43 25 4
gpt4 key购买 nike

我正在使用 Nest 来查询 Elasticsearch,我已经为我的搜索编写了这个查询:

var searchResponse = _elasticClient.Search<AdDocument>(s => s
.Query(q => q
.Bool(b => b
.Must(m => m
.MultiMatch(mm => mm
.Fields(f => f.Field(p => p.Title, 1.5).Field(p => p.Description))
.Query("MyKeyword")
.Fuzziness(Fuzziness.Auto)
)
)
.Filter(fi => fi
.Bool(fb => fb
.Must(m => m.Range(r => r.Field(f => f.NoOfBedrooms == 3)),
m => m.Range(r => r.Field(f => f.NoOfBathrooms == 2)),
m => m.Range(r => r.Field(f => f.Price > 2000))
)
)
)
)
)
);

我想要实现的是根据传入的过滤器动态构建此查询。如何使用 Object Initializer 编写此查询?

例如,我想在查询之外创建这三个范围过滤器并将它们放入 3 个对象中,比如 rangeFilter1rangeFilter2rangeFilter3 然后在查询中使用逻辑与 (&&) 将它们组合起来。

最佳答案

这是对象初始化语法:

var boolQuery = new BoolQuery
{
Must = new QueryContainer[]
{
new MultiMatchQuery
{
Fields = Field<AdDocument>(p => p.Title, 1.5).And<AdDocument>(p => p.Description),
Query = "MyKeyword",
Fuzziness = Fuzziness.Auto
}
},
Filter = new QueryContainer[]
{
new TermQuery { Field = Field<AdDocument>(f => f.NoOfBedrooms), Value = 3 } &&
new TermQuery { Field = Field<AdDocument>(f => f.NoOfBathrooms), Value = 2 } &&
new NumericRangeQuery { Field = Field<AdDocument>(p => p.Price), GreaterThan = 2000 }
}
};

var searchResponse = _elasticClient.Search<AdDocument>(new SearchRequest<AdDocument>
{
Query = boolQuery
});

这将导致以下 JSON DSL:

{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "MyKeyword",
"fuzziness": "AUTO",
"fields": [
"title^1.5",
"description"
]
}
}
],
"filter": [
{
"bool": {
"must": [
{
"term": {
"noOfBedrooms": {
"value": 3
}
}
},
{
"term": {
"noOfBathrooms": {
"value": 2
}
}
},
{
"range": {
"price": {
"gt": 2000.0
}
}
}
]
}
}
]
}
}
}

关于elasticsearch - 使用对象初始值设定项语法构建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com