Elasticsearch中的过滤器嵌套排序

时间:2019-06-25 20:28:31

标签: elasticsearch elasticsearch-dsl

我有一个具有嵌套结构的文档,该嵌套对象有一个assignment_name和一个due_date

映射

{
  "goal": {
    "mappings": {
      "doc": {
        "properties": {
          "title": {
            "type": "keyword"
          },
          // lot's of other fields here ...
          "steps": {
            "type": "nested",
            "properties": {
              "assignment_name": {
                "type": "keyword"
              },
              "due_date": {
                "type": "date"
              }
              // lots of other fields here
            }
          }
        }
      }
    }
  }
}

我要:

  1. 过滤所有具有特定工作名称的文档(例如user_a
  2. 在下一个截止日期之前对结果进行排序,而不考虑其他分配。

此查询为我提供了随机结果(无排序):

{  
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "nested":{  
                  "path":"steps",
                  "query":{  
                     "term":{  
                        "steps.assignment_name":"user_a"
                     }
                  }
               }
            }
         ]
      }
   },
   "sort":[  
      {  
         "steps.due_date":{  
            "order":"asc",
            "nested":{  
               "path":"steps",
               "filter":{  
                  "term":{  
                     "steps.assignment_name":"user_a"
                  }
               }
            }
         }
      }
   ],
   "from":0,
   "size":25
}

1 个答案:

答案 0 :(得分:1)

首先,您需要确保@Advice.OnMethodEnter public static void before(@Advice.This Object obj){ System.out.println(obj); System.out.println("===========ENTERED INFO=========="); } 字段的数据类型为steps。然后,您必须使用nested sorting根据嵌套文档字段对文档进行排序。

查询为:

nested

上面的要点是使用与主查询中相同的过滤器来排序文档。这样可以确保使用正确的嵌套文档的字段值对文档进行排序。