Вам необходимо использовать Nested DataType и соответствующий ему вам необходимо использовать Nested Query
То, что у вас есть в текущей модели, выглядит как базовая модель объекта .
Я упомянул пример сопоставления, образцы документов, вложенный запрос и ответ ниже. Это даст вам то, что вы ищете.
Отображение
PUT resumes
{
"mappings": {
"mydocs": {
"properties": {
"skills": {
"type": "nested",
"properties": {
"skill": {
"type": "keyword"
},
"years": {
"type": "integer"
}
}
}
}
}
}
}
Образцы документов:
POST resumes/mydocs/1
{
"skills": [
{
"skill": "python",
"years": 3
},
{
"skill": "java",
"years": 3
}
]
}
POST resumes/mydocs/2
{
"skills": [
{
"skill": "python",
"years": 2
},
{
"skill": "java",
"years": 3
}
]
}
Запрос
POST resumes/_search
{
"query": {
"nested": {
"path": "skills",
"query": {
"bool": {
"must": [
{
"match": {
"skills.skill": "python"
}
},
{
"match": {
"skills.years": 3
}
}
]
}
}
}
}
}
Ответ на запрос:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.6931472,
"hits": [
{
"_index": "resumes",
"_type": "mydocs",
"_id": "1",
"_score": 1.6931472,
"_source": {
"skills": [
{
"skill": "python",
"years": 3
},
{
"skill": "java",
"years": 3
}
]
}
}
]
}
}
Обратите внимание, что вы извлекаете только документ с идентификатором 1
в ответе выше. Также обратите внимание, что просто для простоты я сделал скиллы skill.skill типа keyword
. Вы можете изменить его на text
в зависимости от вашего варианта использования.
Надеюсь, это поможет!