ElasticSearch 7 nest 7从结果所有结果返回属性

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?