Запустите подзапрос для каждого из отфильтрованных документов elasticsearch - PullRequest
0 голосов
/ 20 июня 2020

У меня есть индекс с именем «сотрудники» со следующей структурой:

{
id: integer,
name: text,
age: integer,
cityId: integer,
resumeText: text           <--------- parsed resume text
}

Я хочу выполнить поиск сотрудников по определенным критериям, например, возраст> 40, resumeText содержит специфику c навыка или сотрудник принадлежит к в определенном городе и c, и у вас есть следующий запрос для текущего требования:

{
query:{
bool:{
should:[
{
term:{
cityId:2990
},
{
match:{
resumeText:"marketing"
},
{
match:{
resumeText:"critical thinking"
}}}
],
filter:{
range:{
age:{
gte:40
}}}}}
}

Это дает мне ожидаемые результаты, но я также хочу знать среди возвращенных документов / сотрудников, которые являются теми, чье резюмеText содержит упомянутые навыки. например, в ответе я хочу получить документы, в которых упоминается, что этот документ соответствует «критическому мышлению», этот сотрудник соответствует обоим навыкам, а этот сотрудник не соответствует ни одному навыку (поскольку он был возвращен на основе других фильтров)

Какие изменения мне нужно сделать, чтобы получить желаемые результаты:

  • может помочь агрегация?
  • можем ли мы выполнить сценарий для КАЖДОГО отфильтрованного документа, чтобы вычислить желаемый результат ( подзапрос для каждого документа)?
  • любой другой подход?

1 Ответ

0 голосов
/ 20 июня 2020

Да, вы можете использовать агрегирование.

Обратитесь к этому

Вы можете объединить в группу, например, сколько резюме соответствует каждому навыку, который вы ищете.

GET employees/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "filters" : {
          "marketing_resume_count" :   { "match" : { "resumeText" : "marketing"   }},
          "thinking_resume_count" : { "match" : { "resumeText" : "thinking" }}
        }
      }
    }
  }
}

Для расширения вашего варианта использования:

Вы можете добавить раздел query в запрос, как показано ниже

GET employees/_search
    {
      "size": 0,
      "query":{
        "match":{
           "region":"AM"
        }
      },
      "aggs" : {
        "messages" : {
          "filters" : {
            "filters" : {
              "marketing_resume_count" :   { "match" : { "resumeText" : "marketing"   }},
              "thinking_resume_count" : { "match" : { "resumeText" : "thinking" }}
            }
          }
        }
      }
    }

Вы можете использовать запрос range для обработки gte и let условия. Вы можете сослаться на на этот для примера запроса диапазона. Его можно использовать вместо раздела query.

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