![](/img/trans.png)
[英]C# Nest, Elastic Search: update and add to a field that is a list
[英]Value in list of values exists in elastic field list nest c#
无法解决弹性问题。
鉴于:
var colors_to_filter = ["red", "blue", "black"];
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.