elasticsearch-net,Nest,elasticsearch Net" /> elasticsearch-net,Nest,elasticsearch Net" />

Nest Elasticsearch嵌套组合筛选器问题

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(

我正在asp.net mvc应用程序中使用elasticsearch嵌套

以下elasticsearch查询引发异常,因为类别和品牌等字段可能为null或空。如何添加if语句并有条件地构建过滤器。谢谢大家!

我必须使用bool&must来组合和筛选搜索条件。例如,一个用户想要鞋类和零售商macys中的产品

 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"
          }
        }
      }
    ]
  }
}