繁体   English   中英

值列表中的值存在于弹性字段列表嵌套 c# 中

[英]Value in list of values exists in elastic field list nest c#

无法解决弹性问题。

鉴于:

  1. 颜色列表: var colors_to_filter = ["red", "blue", "black"];
  2. elasticsearch中的字段颜色: colors: ["green", "red", "black"]

任务:

从elasticsearch 中获取所有颜色已在colors_to_filter列表中定义的产品。 如果colors_to_filter colors字段中存在colors_to_filter任何colors ,则返回该产品。

我当前的代码不起作用:(看看这一行):
.Bool(bl => bl.Filter(fl => fl.Terms( tr => tr.Field(fs => fs.Sizes.Suffix("keyword")).Terms(sizesList))

  .Aggregations(a => a.Terms(sizesAggName, tt => tt.Field(o => o.Sizes.Suffix("keyword")))
                                .Max(priceAggNameMax, st => st.Field(o => o.SalePrice)))
  .TrackTotalHits()
  .Sort(p => GetSortType(sortType))
  .Index(GetIndexName())
  .From(from)
  .Size(size)
  .Query(q => q.Bool(b => GetQuery(mainCategory, subCategory, subSubcategory, term)))
  .PostFilter( ppf => ppf
  .Bool(bl => bl.Filter(fl => fl.Terms( tr => tr.Field(fs => fs.Sizes.Suffix("keyword")).Terms(sizesList))
  && ppf.Range(r => {
               r = r.Field(f => f.SalePrice);
               if (minPrice > 0) r = r.GreaterThanOrEquals((double)minPrice);
               if (maxPrice > 0) r = r.LessThanOrEquals((double)maxPrice);
               return r;
  })))));

我不知道弹性搜索。 然而,要求似乎很明确:

第一个过滤器,其中元素 Color 位于colors_to_filter 然后再次过滤结果,其中的颜色也在colors 只有在两次过滤中都幸存下来的东西才会出现在最终结果中。

一种优化是将这两个列表削减为一个,其中所有颜色都包含在其中(即“红色”和“黑色”)。 然后使用该 amalgm 数组作为过滤器。 我不确定这又是哪种加入。

elasticsearch 应该自动进行优化,这是一个向您展示这一点的示例? 两个类似过滤器的确切顺序或什至是准备连接以提高性能? 这是我唯一能想到的任何搜索/过滤都具有“弹性”的东西。

工作代码:

.Aggregations(a => a.Terms(sizesAggName, tt => tt.Field(o => o.Sizes.Suffix("keyword")))
                                .Max(priceAggNameMax, st => st.Field(o => o.SalePrice)))
  .TrackTotalHits()
  .Sort(p => GetSortType(sortType))
  .Index(GetIndexName())
  .From(from)
  .Size(size)
  .Query(q => q.Bool(b => GetQuery(mainCategory, subCategory, subSubcategory, term)))
  .PostFilter( ppf => ppf
  .Terms(tr =>
         {
             var tt = tr.Field(fs => fs.Sizes.Suffix("keyword"));
             return sizesList.Lenght() > 0 ? tt.Terms(selectedSizes) : tt;
         })
  && ppf.Range(r => {
             r = r.Field(f => f.SalePrice);
             if (minPrice > 0) r = r.GreaterThanOrEquals((double)minPrice);
             if (maxPrice > 0) r = r.LessThanOrEquals((double)maxPrice);
             return r;
  })));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM