ElasticSearch - запрос на фильтрацию и агрегирование по сроку вложенного объекта
У меня есть вложенные объекты в индекс моего эластичного поиска следующего типа
"_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
но он должен возвращать мне только имена активных пользователей. У меня возникают проблемы с выполнением этих вложенных операций, так как поиск активного состояния возвращает запись, в которой активен даже один из пользователей. Я не могу специально отфильтровывать неактивных пользователей. Любая помощь в этом отношении очень ценится.
поскольку вы всегда заинтересованы в получении пользователей, тогда в этом случае отношения между родителями и дочерними элементами будут лучше, чем тип вложенных документов для пользователей. Как и в вложенном типе, ответ будет иметь ненужную полезную нагрузку с помощью 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
}
}
}
}
}
}