Запрос Сортировка вложенных документов в Elasticsearch - PullRequest
1 голос
/ 11 октября 2019

Я новичок в Elasticsearch и извиняюсь, если запрос, который я задаю, очень прост и понятен.

Я использую следующее картирование студентов с их данными об образовании,

PUT students
{
  "mappings" : {
      "properties" : {
        "StudentName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "Education" : {
          "type" : "nested",
          "properties" : {
            "degreeName" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "schoolName" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "endDate" : {
              "type" : "date"
            },
            "startDate" : {
              "type" : "date"
            }
          }
        }
      }
  }
}

У меня около 15000 студентов в моем наборе данных. Пример документа:

PUT students/_doc/2
{
  "StudentName":"Student 2",
  "Education": [
    {
      "degreeName": "MS",
      "schoolName": "School Y",
      "startDate": "2016-05-01",
      "endDate":"2014-01-01"
    },
    {
      "degreeName": "PhD",
      "schoolName": "School X",
      "startDate": "2019-01-01",
      "endDate":"2017-05-01"
    },
    {
      "degreeName": "BE",
      "schoolName": "School Z",
      "startDate": "2013-05-01",
      "endDate":"2009-01-01"
    }]
}

PUT students/_doc/3
{
  "StudentName":"Student 3",
  "Education": [
    {
      "degreeName": "BE",
      "schoolName": "School P",
      "startDate": "2003-01-01",
      "endDate":"1999-05-01"
    }]
}

Мой вопрос заключается в том, что я пытаюсь выполнить простой запрос, чтобы показать студентам, которые имеют степень "BE" в качестве своей степени. Но я хочу, чтобы студенты, имеющие текущую степень BE (бакалавр инженерных наук), имели более высокий рейтинг, чем студенты, которые также получили степень магистра и доктора наук.

Из моих примеров, если я запрашиваю "BE", студент 3 должен быть оцененвыше студента 2. Я должен иметь возможность сортировать вложенные документы в порядке убывания на основе свойства endDate, а затем повышать его, если значение «degName» соответствует «BE» в первом элементе отсортированного вложенного поля.

МожетКто-нибудь, пожалуйста, пролить свет на это? Я прошел через вложенный запрос, вложенный фильтр. Я знаю, как сортировать элементы во вложенном поле, используя «Внутренние попадания». Но я хотел бы знать, есть ли способ сортировки, а затем запросить, чтобы дать дополнительный импульс.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 октября 2019

Самым простым решением было бы включить предложение should вместе с предложением must, а в предложении should вы упомянули только логику наличия студентов with BE but without MS or PhD.

Все это в вашем логическом запросе

Обратите внимание, что must метафорически похож на AND логику, тогда как should будет OR.

Как только это будет сделано, вы можете просто добавить логику в Sort (как упомянуто в ссылке) к сначала сортировке, используя _score, а затем сортировать поEducation.endDate поле.

Ниже показано, как будет найдено решение:

POST students/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match" :{
            "StudentName": "student"
          }
        }
      ], 
      "should": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "Education",
                  "query": {
                    "terms": {
                      "Education.degreeName.keyword": [
                        "BE"
                      ]
                    }
                  }
                }
              }
            ],
            "must_not": [
              {
                "nested": {
                  "path": "Education",
                  "query": {
                    "terms": {
                      "Education.degreeName.keyword": [
                        "MS",
                        "PhD"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "sort": [
    { "_score" : { "order": "desc"}},
    {
      "Education.endDate": {
        "order": "desc"
      }
    }
  ]
}

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...