ElasticSearch - запрос на фильтрацию и агрегирование по сроку вложенного объекта

61
4

У меня есть вложенные объекты в индекс моего эластичного поиска следующего типа

 "_source": {
"NAME": "MNQ",
"LAST_MOD_DATE": 1373587200000,
"ACTIVE_FL": "Y",
"ID": "1008",
"USER": [
{
"USR_ID": 499,
"STATUS": "INACTV",
"NAME": "ABC"
},
{
"USR_ID": 53,
"STATUS": "ACTV",
"NAME": "XYZ"
}
]
}

И у меня есть следующие варианты использования запроса для индекса:

    Получить всех активных пользователей для определенного идентификатора. Например: я хочу, чтобы пользователи, которые активны для id 1008 которые в этом случае будут пользователем XYZ Получить всех активных пользователей. Например: я выполняю запрос match_all, и я собираюсь агрегировать его в USER.NAME но он должен возвращать мне только имена активных пользователей.

У меня возникают проблемы с выполнением этих вложенных операций, так как поиск активного состояния возвращает запись, в которой активен даже один из пользователей. Я не могу специально отфильтровывать неактивных пользователей. Любая помощь в этом отношении очень ценится.

спросил(а) 2021-01-19T19:23:41+03:00 2 месяца, 3 недели назад
1
Решение
106

поскольку вы всегда заинтересованы в получении пользователей, тогда в этом случае отношения между родителями и дочерними элементами будут лучше, чем тип вложенных документов для пользователей. Как и в вложенном типе, ответ будет иметь ненужную полезную нагрузку с помощью inner_hits для эластичности.

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

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

Отображения для отношений родитель-ребенок

PUT parent_child_index
{
"mappings": {
"parent_document": {
"properties": {
"NAME": {
"type": "keyword"
}
}
},
"user": {
"_parent": {
"type": "parent_document"
},
"properties": {
"USER_ID": {
"type": "keyword"
},
"STATUS": {
"type": "keyword"
},
"NAME": {
"type": "keyword"
}
}
}
}
}

Индекс родительских дочерних документов

POST parent_child_index/parent_document
{
"NAME": "MNQ",
"LAST_MOD_DATE": 1373587200000,
"ACTIVE_FL": "Y",
"ID": "1008"
}

POST parent_child_index/user?parent=AVyBzQXmp_hWdUR22wGr
{
"USR_ID": 53,
"STATUS": "ACTV",
"NAME": "XYZ"
}

запрос

POST parent_child_index/user/_search
{
"query": {
"bool": {
"must": [{
"has_parent": {
"parent_type": "parent_document",
"query": {
"bool": {
"must": [{
"term": {
"ID": {
"value": "1008"
}
}
}]
}
}
}
},
{
"term": {
"STATUS": {
"value": "ACTV"
}
}
}
]
}
}
}

POST parent_child_index/user/_search
{
"size": 0,
"aggs": {
"active_users": {
"filter": {
"term": {
"STATUS": "ACTV"
}
},
"aggs": {
"user_name": {
"terms": {
"field": "NAME",
"size": 10
}
}
}
}
}
}

ответил(а) 2021-01-19T19:23:41+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема