elasticsearch Nested Object 네스트된 객체 매핑, 쿼리, 집계 분석

Elasticsearch에서 연관 관계 처리


#● 관계형 데이터베이스, Normalize # 데이터를 고려한다.Elasticsearch에서는 흔히 #Denormalize 데이터 #●Denormalize의 장점을 고려한다. 읽는 속도가 빨라진다/#시계 연결/자물쇠 필요#●Elasticsearch#연관관계를 잘 처리하지 못한다.다음 # 4가지 연관 처리 # ○ 객체 유형 # 중첩 객체 (Nested Object) # ○ 연계 (Parent/Child) # 응축단 연관
DELETE blog

블로그 맵핑 설정

PUT /blog
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      },
      "time": {
        "type": "date"
      },
      "user": {
        "properties": {
          "city": {
            "type": "text"
          },
          "userid": {
            "type": "long"
          },
          "username": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Blog 정보 삽입

PUT blog/_doc/1
{
  "content":"I like Elasticsearch",
  "time":"2019-01-01T00:00:00",
  "user":{
    "userid":1,
    "username":"Jack",
    "city":"Shanghai"
  }
}

글에 elasticsearch 작가가 jack이라는 글이 포함된 것을 찾았습니다.

POST blog/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "Elasticsearch"
          }
        },
        {
          "match": {
            "user.username": "Jack"
          }
        }
      ]
    }
  }
}

## 

DELETE my_movies

영화의 Mapping 메시지

PUT my_movies
{
      "mappings" : {
      "properties" : {
        "actors" : {
          "properties" : {
            "first_name" : {
              "type" : "keyword"
            },
            "last_name" : {
              "type" : "keyword"
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

영화 정보 쓰기

POST my_movies/_doc/1
{
  "title":"Speed",
  "actors":[
    {
      "first_name":"Keanu",
      "last_name":"Reeves"
    },

    {
      "first_name":"Dennis",
      "last_name":"Hopper"
    }

  ]
}

우리는 이전처럼 검색을 진행했는데, 검색 이름은 Keanu이고, lastName은 Hopper였다. 이런 배우가 없었기 때문에 데이터를 찾을 수 없었을 것이다


그러나 데이터가 저장될 때 내부 대상의 가장자리를 고려하지 않았기 때문에 json 형식은 편평한 키 값이 맞는 구조로 처리되었다.


예: title: Speed


“actors.first_name”:[“Keanu”,“Dennis”]


“actors.last_name”:[“Reeves”,“Hopper”]


이 문제를 해결하려면 Nested Data Type을 사용하십시오.
POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "actors.first_name": "Keanu"
          }
        },
        {
          "match": {
            "actors.last_name": "Hopper"
          }
        }
      ]
    }
  }
}

Nested Data Type 중첩 데이터 유형


Nested 데이터 형식, 대상 숫자의 대상을 독립적으로 인덱스 (저장) 할 수 있도록 합니다.


내부에서nested 문서는 두 개의 루틴에 저장되며, 검색할 때join 처리를 합니다


색인 다시 만들기, 형식nested 지정


내부에 중첩된 데이터 속성 지정

DELETE my_movies
PUT my_movies
{
  "mappings": {
    "properties": {
      "actors": {
        "type": "nested",
        "properties": {
          "first_name": {
            "type": "keyword"
          },
          "last_name": {
            "type": "keyword"
          }
        }
      },
      "title": {
        "type": "text"
      }
    }
  }
}

POST my_movies/_doc/1
{
  "title":"Speed",
  "actors":[
    {
      "first_name":"Keanu",
      "last_name":"Reeves"
    },

    {
      "first_name":"Dennis",
      "last_name":"Hopper"
    }

  ]
}

중첩된 대상에 대해 우리는 조회를 할 때도 중첩된 조회를 지정하고 중첩된 경로를 지정해야 한다


플러그인 조회가 필요한 곳에 nested path 경로를 지정합니다


우리가 잘못된 배우 이름을 지정할 때 데이터를 얻을 수 없고, 정확할 때

POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "Speed"
          }
        },
        {
          "nested": {
            "path": "actors",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "actors.first_name": "Keanu"
                    }
                  },
                  {
                    "match": {
                      "actors.last_name": "Hopper"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "Speed"
          }
        },
        {
          "nested": {
            "path": "actors",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "actors.first_name": "Keanu"
                    }
                  },
                  {
                    "match": {
                      "actors.last_name": "Reeves"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

Nested Aggregation의 중첩 통 집합


작자의 성으로 조를 나누다


우리는 이전의 방식대로 aggregation을 진행하였는데, 사실 그는 일을 진행할 수 없다는 것을 발견하였다

POST my_movies/_search
{
  "size": 0,
  "aggs": {
    "actor_name": {
      "terms": {
        "field": "actors.first_name"
      }
    }
  }
}

플러그인 대상을 집합 분석할 때, 우리는 집합의 필드를 nested 플러그인 대상으로 지정하고, 경로를 지정하여 우리의 집합 분석을 nested 내의 하위 집합 분석에 써야 한다


우리의 서브집합은 집합 분석을 하는 것이고 주집합은 집합 분석 작업을 하지 않은 것을 알 수 있다

POST my_movies/_search
{
  "size": 0,
  "aggs": {
    "actors": {
      "nested": {
        "path": "actors"
      },
      "aggs": {
        "actor_name": {
          "terms": {
            "field": "actors.first_name",
            "size": 10
          }
        }
      }
    },
    "actor_name": {
      "terms": {
        "field": "actors.first_name"
      }
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/query-dsl-nested-query.html

좋은 웹페이지 즐겨찾기