Агрегация Elasticsearch по индексу массива или альтернативному решению

#elasticsearch #elasticsearch-aggregation #elasticsearch-dsl

#elasticsearch #elasticsearch-агрегация #elasticsearch-dsl

Вопрос:

У меня есть несколько документов в elasticsearch, похожих на эти примеры:

 {
  "id": "<<some id>>",
  "list": [
    "a",
    "b",
    "c"
  ]
}
  
 {
  "id": "<<some id>>",
  "list": [
    "c",
    "a"
  ]
}
  

Такие, как list могут содержать a , b и c в любом порядке и не обязательно все из них. порядок элементов в list имеет значение.

Я хотел бы запустить эти агрегированные группы:

  • сколько документов содержится a в любой позиции
  • сколько документов содержится a в первой позиции

Возможно ли это при текущей структуре документа? Могу ли я структурировать документ по-другому?

Если это невозможно с текущей структурой, я думал создать что-то вроде:

 {
  "id": "<<some id>>",
  "list": {
    "values": ["c", "a"],
    "ordered": {
      "0": "c",
      "1": "a"
    }
  } 
}
  

Или

 {
  "id": "<<some id>>",
  "list": {
    "values": ["c", "a"],
    "ordered": {
      "a": 1,
      "c": 0
    }
  } 
}
  

С помощью последнего я также мог бы запускать агрегацию, подобную a < c и так далее.

Спасибо за вашу помощь

Ответ №1:

могут быть какие-либо лучшие доступные способы, но если вы можете сохранить его как position, за которым следует ваш ключ:

 {
  "id": "<<some id>>",
  "list": [
    "1_a",
    "2_b",
    "3_c"
  ]
}
  

Другой документ,

 {
  "id": "<<some id>>",
  "list": [
    "1_c",
    "2_a"
  ]
}
  

затем вы можете запустить над ним обычные агрегации, и это вернет что-то вроде:

 1_a:1
2_a:1 ... etc
  

после этого во время обработки вам нужно разделить на _ , иначе вы можете поиграть со сценариями.