Elasticsearch - Как получить список документов с уникальной комбинацией двух полей? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть следующие данные в Elasticsearch (6.7):

{
  "first_name": "abc",
  "last_name": "def",
  "sat":900,
  "description":"desc1" 
}
{
  "first_name": "abc",
  "last_name": "def",
  "sat":1100,
  "description":"desc2" 

}
{
  "first_name": "abc",
  "last_name": "ghi",
  "sat":1000,
  "description":"desc3" 

}

Результатом должны быть только документы с уникальным набором first_name и last_name . И для этой уникальной комбинации должна быть возвращена сумма сат. описание может быть любым из описаний в этой комбинации.

Результат должен быть:

{
  "first_name": "abc",
  "last_name": "def",
  "sat":2000,
  "description":"desc1"  

}
{
  "first_name": "abc",
  "last_name": "ghi",
  "sat":1000,
  "description":"desc3" 

}

Я пытался использовать этот запрос, чтобы получить уникальную комбинацию firstName и lastName:

{
    "aggs" : {
        "genres" : {
            "terms" : {
                "script" : {
                    "source": "doc['first_name.keyword']+''+doc['last_name.keyword']",
                    "lang": "painless"
                }
            }

        }
    }
}

Может выполнять вложенную агрегацию в нем для оценки сат-суммы. Но как нам получить описание? Есть мысли об использовании скрипта здесь во время запроса?

1 Ответ

1 голос
/ 29 октября 2019

Я бы создал новый автоматический набор, заполненный сопоставлениями. Скрипт будет довольно медленным.

{
  "mappings": {
    "test": {
      "properties": {
        "first_name": {
          "type": "keyword",
          "copy_to": "complete_name"
        },
        "last_name": {
          "type": "keyword",
          "copy_to": "complete_name"
        },
        "complete_name": {
          "type": "keyword"
        }
      }
    }
  }
}

Вам просто нужно агрегировать по имени_файла и добавить 2 подагрегации (по деск и суммировать сат)

{
   "size" : 0,
   "aggs": {
      "genres": {
         "terms": {
            "field": "complete_name"
         },
         "aggs": { 
            "sum_sat": { 
               "sum": {
                  "field": "sat" 
               }
            }
         },
         "aggs": { 
            "any_desc": { 
               "terms": {
                  "field": "description" 
               },
               "size": 1
            }
         }
      }
   }
}

вы также можете использовать агрегацию tophitsнацелить на описание, которое вы хотите.

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