ElasticSearch:对复杂查询进行排序

Posted

技术标签:

【中文标题】ElasticSearch:对复杂查询进行排序【英文标题】:ElasticSearch: Sorting a complex query 【发布时间】:2018-09-21 11:05:34 【问题描述】:

我在 Elasticsearch(如下)中有一个复杂的查询,我需要在“Activité”(活动)存储桶中按 date_creation 升序排序。查询有效,但我对 date_creation 的基本排序无效。我正在寻找如何按 date_creation 升序对活动进行排序。我看过一些关于嵌套查询here on *** 的帖子,例如和here in the elastic search documentation,但他们似乎没有回答如何解决我的查询的复杂性。

我正在使用 ElasticSearch 2.3.5 和 Lucene 5.5.0。

var searchQuery = 
  index: "resultats_" + env,
  body: 
    size: 0,
    sort: [ date_creation:  order: "asc", mode: "min"  ],
    query: 
      filtered: 
        query: 
          match_all: 
        ,
        filter: 
          query: 
            bool: 
              should: [],
              must: [
                
                  term: 
                    player_id: 
                      value: params.player_id
                    
                  
                ,
                
                  term: 
                    classes: 
                      value: params.grade
                    
                  
                
              ],
              must_not: []
            
          
        
      
    ,
    aggs: 
      Matière: 
        terms: 
          field: "id_matiere",
          size: 10
        ,
        aggs: 
          "Titre matière": 
            top_hits: 
              _source: 
                include: ["titre_matiere"]
              ,
              size: 1
            
          ,
          PP: 
            terms: 
              field: "id_point_pedago",
              size: 10
            ,
            aggs: 
              "Titre PP": 
                top_hits: 
                  _source: 
                    include: ["titre_point_pedago"]
                  ,
                  size: 1
                
              ,
              Compétence: 
                terms: 
                  field: "id_competence",
                  size: 10
                ,
                aggs: 
                  "Titre compétence": 
                    top_hits: 
                      _source: 
                        include: ["titre_competence"]
                      ,
                      size: 1
                    
                  ,
                  Activité: 
                    terms: 
                      field: "id_activite",
                      size: 10
                    ,
                    aggs: 
                      "Titre activité": 
                        top_hits: 
                          _source: 
                            include: [
                              "titre_activite",
                              "nombre_perimetre_occurrence"
                            ]
                          ,
                          size: 1
                        
                      ,
                      Trimestres: 
                        filters: 
                          filters: 
                            T1: 
                              range: 
                                date_creation: 
                                  gte: params.t1_start,
                                  lte: params.t1_end
                                
                              
                            ,
                            T2: 
                              range: 
                                date_creation: 
                                  gte: params.t2_start, 
                                  lte: params.t2_end 
                                
                              
                            ,
                            T3: 
                              range: 
                                date_creation: 
                                  gte: params.t3_start, 
                                  lte: params.t3_end
                                
                              
                            
                          
                        ,
                        aggs: 
                          Moyenne: 
                            avg: 
                              field: "resultat"
                            
                          ,
                          Occurrences: 
                            cardinality: 
                              field: "id_occurrence",
                              precision_threshold: 1000
                            
                          ,
                          Résultat: 
                            terms: 
                              field: "resultat",
                              size: 10,
                              min_doc_count: 0
                            
                          
                        
                      
                    
                  
                
              
            
          
        
      
    
  
;

【问题讨论】:

所以你想对Activité聚合下的热门排序? 是的,@Val 听起来很对。 【参考方案1】:

你可以这样做:

              Activité: 
                terms: 
                  field: "id_activite",
                  size: 10
                ,
                aggs: 
                  "Titre activité": 
                    top_hits: 
                      _source: 
                        include: [
                          "titre_activite",
                          "nombre_perimetre_occurrence"
                        ]
                      ,
                      size: 1,
add this line ->      sort: [ date_creation:  order: "asc", mode: "min"  ],
                    
                  ,

【讨论】:

我无法确认它是否正常工作,但我可以确认它没有破坏我的查询 - 您的回答有助于我了解总体思路。 酷,很高兴它有帮助,如果您有更多问题,请随时回来。

以上是关于ElasticSearch:对复杂查询进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch搜索关键字不进行分词

Elasticsearch使用篇 - 查询排序

04-springboot整合elasticsearch初识-简单增删改查及复杂排序,分页,聚合操作

ElasticSearch聚合aggs入门

如果状态为真,则 Elasticsearch bool 查询按日期排序

elasticsearch有么有像sql中like那样的查询