如何解决ElasticSearch 7 nest 7从结果所有结果返回属性
我正在使用ElarsticSearch 7.7和nesT 7.7,在我的网页上,每页有9个搜索结果文档。即使我在页面上显示前9个结果,我也需要从所有结果中返回一些属性值,以便在网页上进行侧面过滤。
例如:如果我搜索“ LapTop”,则我的页面将在第一页上显示9条结果。另外,我需要显示所有搜索结果中的所有“商品” 。不仅制造商在首页上排名。然后,客户不仅可以在首页上显示,还可以按制造商进行过滤。 我尝试过GlobalAggregation,但是它返回类别并仅在选定页面中制造商品。
public SearchResult Search(SearchType searchType,string searchQuery,int storeId,int pageNumber = 1,int pageSize = 12,IList<SearchFilter> requestFilter = null,decimal? priceFrom = 0,decimal? priceto = 100000000,string sortBy = null,int totalCount = 0)
{
var queryContainer = new QueryContainer();
var sorts = new List<ISort>();
sorts.Add(new FieldSort { Field = "_score",Order = SortOrder.Descending });
switch (sortBy)
{
case "z-a":
sorts.Add(new FieldSort { Field = Field<ElasticIndexGroupProduct>(p => p.sortValue),Order = SortOrder.Descending });
break;
case "a-z":
sorts.Add(new FieldSort { Field = Field<ElasticIndexGroupProduct>(p => p.sortValue),Order = SortOrder.Ascending });
break;
}
var aggrigations = new AggregationDictionary
{
{"average_per_child",new
AverageAggregation("average_per_child",Field<ElasticIndexGroupProduct>(d => d.Price))},{"max_per_child",new MaxAggregation("max_per_child",Field<ElasticIndexGroupProduct>(d => d.Price))},{"min_per_child",new MinAggregation("min_per_child",{
"globle_filter_aggrigation",new GlobalAggregation("globle_filter_aggrigation")
{
Aggregations =new AggregationDictionary
{
{"category_flow",new TermsAggregation("category_flow"){Field = Field<ElasticIndexGroupProduct>(p => p.CategoryFlow)} },{"manufacturers",new TermsAggregation("manufacturers"){Field = Field<ElasticIndexGroupProduct>(p => p.Manufacturer)} }
}
}
}
};
var searchRequest = new SearchRequest<ElasticIndexGroupProduct>()
{
Profile = true,From = (pageNumber - 1) * pageSize,Size = pageSize,Version = true,Sort = sorts,//Scroll = Time.MinusOne,Aggregations = aggrigations
};
var multiMatch = new QueryStringQuery
{
Query = searchQuery,Fields = GetSearchFields(searchType),Boost = 1.1,Name = "named_query",DefaultOperator = Operator.Or,Analyzer = "standard",QuoteAnalyzer = "keyword",AllowLeadingWildcard = true,MaximumDeterminizedStates = 2,Escape = true,FuzzyPrefixLength = 2,FuzzyMaxExpansions = 3,FuzzyRewrite = MultiTermQueryRewrite.Constantscore,Rewrite = MultiTermQueryRewrite.Constantscore,Fuzziness = Fuzziness.Auto,TieBreaker = 1,AnalyzeWildcard = true,MinimumShouldMatch = 2,QuoteFieldSuffix = "'",Lenient = true,AutoGenerateSynonymsPhraseQuery = false
};
searchRequest.Query = new BoolQuery
{
Must = new QueryContainer[] { multiMatch },Filter = new QueryContainer[] { queryContainer }
};
var searchResponse = _client.Search<ElasticIndexGroupProduct>(searchRequest);
var categoryFlowsGlobe = new List<string>();
var allAggregations = searchResponse.Aggregations.Global("globle_filter_aggrigation");
var categories = allAggregations.Terms("category_flow");
foreach (var aggItem in categories.Buckets)
{
if (!categoryFlowsGlobe.Any(x => x == aggItem.Key))
{
categoryFlowsGlobe.Add(aggItem.Key);
}
}
}
解决方法
这是Post filter
的确切用例-运行搜索请求以返回匹配结果和汇总,然后对汇总后的匹配项应用过滤已经计算了。
对于制造商,可以在搜索请求中使用术语汇总来检索它们-如果您需要退回所有制造商,则可以调整汇总的大小,否则,您可能决定只返回顶部x。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。