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

问题描述 投票:0回答:2

无法解决弹性问题。

给出:

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

任务:

从Elasticsearch中获取具有colors_to_filter列表中定义的颜色的所有产品。如果Elasticsearch 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;
  })))));

c# elasticsearch nest
2个回答
0
投票

我不知道Elasticsearch。但是要求似乎很明确:

第一个过滤器包含的元素颜色在colors_to_filter中。然后,再次按colors中的[色彩过滤结果。最终的结果是只有在两个过滤条件下都能生存的事物。

一种最佳做法是将这两个列表都缩减为一个,并且所有颜色都都在这两种颜色之间(夹心分别为“红色”和“黑色”)。然后使用该amalgm数组作为过滤器。我不确定再次加入这种方式。

我是

猜测

elastisearch应该自动进行优化,这是向您显示该示例的示例?两个相似的过滤器的确切顺序或什至是准备联接的性能?我认为这是唯一对任何搜索/过滤都“具有弹性”的事情。

0
投票
工作代码:

.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")); if (sizesList != "null") return tr.Field(fs => fs.Sizes.Suffix("keyword")).Terms(selectedSizes); return 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; })));

© www.soinside.com 2019 - 2024. All rights reserved.