Фильтр вложенной сортировки вasticsearch - PullRequest
1 голос
/ 25 июня 2019

У меня есть документ с вложенной структурой, вложенный объект имеет 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 Ответ

1 голос
/ 26 июня 2019

Во-первых, вам нужно убедиться, что тип данных для поля steps равен nested. Затем вы должны использовать вложенную сортировку для сортировки документов на основе вложенного поля документа.

Запрос будет:

{
  "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"
            }
          }
        }
      }
    }
  ]
}

Выгода, указанная выше, заключается в использовании того же фильтра в сортировке, который использовался в основном запросе для фильтрации документов. Это гарантирует, что правильное значение поля вложенного документа считается для сортировки документов.

...