ElasticSearch 7 nest 7 return attribute from result 所有结果

ElasticSearch 7 nest 7 return attribute from result all result

我正在使用 ElarsticSearch 7.7 和 NEST 7.7,在我的网页上,每页有 9 个搜索结果文档。即使我在页面上显示前 9 个结果,我也需要从所有结果中 return 一些 属性 值以在网页上进行侧过滤。

例如:如果我正在搜索“LapTop”,我的页面将在第一页显示 9 个结果。此外,我需要显示所有搜索结果中的所有“制造商”。不仅是第一页结果中的制造商。然后客户可以按制造商筛选,而不仅仅是显示在第一页上。 我已经尝试过 GlobalAggregation,但它 return 分类并且只制造选定页面中的项目。

  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", Field<ElasticIndexGroupProduct>(d => d.Price))},
                    {
                     "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 的确切用例 - 运行 搜索请求 return 命中和聚合, 然后 到在计算聚合后对命中应用过滤

对于制造商,这些可以通过搜索请求中的术语聚合来检索 - 如果需要 return all 制造商,您可以调整聚合的大小,否则您可能会决定 return 仅顶部 x.