Исходя из ваших требований, вам необходимо определить свое поле attrs
как вложенное. Для получения дополнительной информации обратитесь к вложенному типу в Elasticsearch . Заявление об отказе от ответственности: он поддерживает взаимосвязь, но требует больших затрат на запрос.
Ответ на два других вопроса также зависит от того, какой тип данных вы используете, пожалуйста, обратитесь к тип данных вложенный или объектный для получения дополнительных сведений
Изменить: решение с использованием образца сопоставления, примеров документов и ожидаемого результата
Сопоставление индекса с использованием вложенного типа
{
"mappings": {
"properties": {
"attrs": {
"type": "nested"
}
}
}
}
Индекс 2 образец do c один, который разделяет критерии, а другой - нет
{
"attrs": [
{
"name": "username",
"value": "johndoe"
},
{
"name": "alias",
"value": "myname"
}
]
}
Другой, который обслуживает критерии
{
"attrs": [
{
"name": "username",
"value": "jimihendrix"
},
{
"name": "age",
"value": 23
},
{
"name": "alias",
"value": "johndoe"
}
]
}
И поисковый запрос
{
"query": {
"nested": {
"path": "attrs",
"inner_hits": {},
"query": {
"bool": {
"must": [
{
"match": {
"attrs.name": "username"
}
},
{
"match": {
"attrs.value": "johndoe"
}
}
]
}
}
}
}
}
И результат поиска
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "2",
"_score": 1.7509375,
"_source": {
"attrs": [
{
"name": "username",
"value": "johndoe"
},
{
"name": "alias",
"value": "myname"
}
]
},
"inner_hits": {
"attrs": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.7509375,
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "2",
"_nested": {
"field": "attrs",
"offset": 0
},
"_score": 1.7509375,
"_source": {
"name": "username",
"value": "johndoe"
}
}
]
}
}
}
}
]