Nest Elasticsearch嵌套组合筛选器问题
我正在asp.net mvc应用程序中使用elasticsearch嵌套 以下elasticsearch查询引发异常,因为类别和品牌等字段可能为null或空。如何添加if语句并有条件地构建过滤器。谢谢大家! 我必须使用bool&must来组合和筛选搜索条件。例如,一个用户想要鞋类和零售商macys中的产品Nest Elasticsearch嵌套组合筛选器问题,nest,elasticsearch-net,Nest,elasticsearch Net,我正在asp.net mvc应用程序中使用elasticsearch嵌套 以下elasticsearch查询引发异常,因为类别和品牌等字段可能为null或空。如何添加if语句并有条件地构建过滤器。谢谢大家! 我必须使用bool&must来组合和筛选搜索条件。例如,一个用户想要鞋类和零售商macys中的产品 s.Query(q => q .Bool(bq => bq .Must(
s.Query(q => q
.Bool(bq => bq
.Must(
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("Categories", request.Categories))
),
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("BrandName", request.Brands))
),
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("RetailerName", request.Retailers))
),
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("RetailerName", request.Retailers))
),
mq => mq.Range(r => r
.OnField("SellingPrice")
.GreaterOrEquals((double)request.PriceRanges[0].Start)
.LowerOrEquals((double)request.PriceRanges[0].End)
)
)
)
);
您不必关心传递给查询的null或空值,因为NEST具有调用的特性。文件说 如果任何查询将导致空查询,则它们不会被删除 发送到Elasticsearch 异常的原因是以下代码行:
mq => mq.Range(r => r
.OnField("SellingPrice")
.GreaterOrEquals((double)request.PriceRanges[0].Start)
.LowerOrEquals((double)request.PriceRanges[0].End)
)
Propably PriceRanges为null或空,您正试图从第一个元素访问开始和结束属性。如果您只使用PriceRanges中的第一个项目,那么您可以将请求类更改为以下内容,这将是非常棒的:
对于此请求对象
var request = new Request
{
Brands = new List<string>{"brand"},
PriceRangesEnd = 100
};
非常感谢。f、 术语分类,请求。类别比较任何类别。我如何比较所有这些?比如鞋子,礼物。我想返回的结果,类别匹配鞋子和礼物,而不是鞋子或礼物。我确实看到了terms筛选器的执行选项,我不知道这是否有用。您可以共享您的索引映射吗?mq=>mq.Filteredfq=>fq.Filterf=>f.TermsCategories、request.Categories、TermsExecution.And比较所有项,但区分大小写。我在映射中没有分析这个字段。如何使比较不区分大小写?下面是字段类别的映射:{type:string,index\u name:Category,index:not\u analysisd}下面是完整的映射。我使用类别和其他几个字段进行聚合-d{settings:{number_of_shard:1},映射:{summary:{properties:{RetailerName:{type:string,index:not_analyzed},BrandName:{type:string,index:not_analyzed},SellingPrice:{type:float},AffiliateMarketingVerbs:{type:string,index_name:AffiliateMarketingVerb,index:not_analyzed},categs:{type:string,index_name:Category,index:not_analysisd}}'
s.Query(q => q
.Bool(bq => bq
.Must(
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("Categories", request.Categories))
),
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("BrandName", request.Brands))
),
mq => mq.Filtered(fq => fq
.Filter(f => f.Terms("RetailerName", request.Retailers))
),
mq => mq.Range(r => r
.OnField("SellingPrice")
.GreaterOrEquals(request.PriceRangeStart)
.LowerOrEquals(request.PriceRangeEnd)
)
)
));
var request = new Request
{
Brands = new List<string>{"brand"},
PriceRangesEnd = 100
};
"query": {
"bool": {
"must": [
{
"filtered": {
"filter": {
"terms": {
"BrandName": [
"brand"
]
}
}
}
},
{
"range": {
"SellingPrice": {
"lte": "100"
}
}
}
]
}
}