gpt4 book ai didi

c# - 具有多个术语的 NEST 条件过滤器查询

转载 作者:可可西里 更新时间:2023-11-01 08:15:40 25 4
gpt4 key购买 nike

我想像这样进行 ElasticSearch 查询:

{
"query" :
{
"bool" :
{
"filter" : [
{
"terms" :
{
"name" : ["name1", "name2"]
}
},
{
"terms" :
{
"color" : ["orange", "red"]
}
}
]
}
}
}

我试过像这样在 NEST 中实现它:

_elasticClient
.SearchAsync<MyDocument>(s =>
s.Index("myindex")
.Query(q => q
.Bool(bq => bq
.Filter(fq =>
{
QueryContainer query = null;

if (nameList.Any()) {
query &= fq.Terms(t => t.Field(f => f.Name).Terms(nameList));
}

if (colorList.Any()) {
query &= fq.Terms(t => t.Field(f => f.Color).Terms(colorList));
}

return query;
})
)
)
);

但这给了我一个像这样的查询,其中过滤器被包裹在 bool must 中:

{
"query" :
{
"bool" :
{
"filter" : [
{
"bool" :
{
"must" : [
{
"terms" :
{
"name" : ["name1", "name2"]
}
},
{
"terms" :
{
"color" : ["orange", "red"]
}
}
]
}
}
]
}
}
}

我应该如何更改我的 NEST 代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer 以外的其他内容?

最佳答案

如果您想检查条件过滤器,您可以在进行查询之前创建一个过滤器列表,如下所示:

var nameList = new[] {"a", "b"};
var colorList = new[] {1, 2};

var filters = new List<Func<QueryContainerDescriptor<MyDocument>, QueryContainer>>();
if (nameList.Any())
{
filters.Add(fq=> fq.Terms(t => t.Field(f => f.Name).Terms(nameList)));
}

if (colorList.Any())
{
filters.Add(fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList)));
}

ISearchResponse<Property> searchResponse =
elasticClient.Search<MyDocument>(x => x.Query(q => q
.Bool(bq => bq.Filter(filters))));

如果您在进行过滤器查询之前不需要检查任何条件,那么您可以使用类似的东西:

ISearchResponse<MyDocument> searchResponse =
elasticClient.Search<MyDocument>(x => x.Query(q => q
.Bool(bq => bq
.Filter(
fq => fq.Terms(t => t.Field(f => f.Name).Terms(nameList)),
fq => fq.Terms(t => t.Field(f => f.Color).Terms(colorList))
))));

关于c# - 具有多个术语的 NEST 条件过滤器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37697866/

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