#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
после этого во время обработки вам нужно разделить на _
, иначе вы можете поиграть со сценариями.