본 문서는 개인적인 테스트와 elasticsearch.org 그리고 community 등을 참고해서 작성된 것이며,
정보 교환이 목적입니다.
잘못된 부분에 대해서는 지적 부탁 드립니다.
(예시 코드는 성능 및 보안 검증이 되지 않았습니다.)
[elasticsearch 리뷰]
원문 링크
http://www.elasticsearch.org/guide/reference/mapping/
http://www.elasticsearch.org/guide/reference/mapping/array-type/
http://www.elasticsearch.org/guide/reference/mapping/object-type/
http://www.elasticsearch.org/guide/reference/mapping/nested-type/
원문 예제가 잘 나와 있어 그대로 사용 합니다.
[Document]
"tweet" : {
"message" : "some arrays in this tweet...",
"tags" : ["elasticsearch", "wow"],
"lists" : [
{
"name" : "prog_list",
"description" : "programming list"
},
{
"name" : "cool_list",
"description" : "cool stuff list"
}
]
}
[Mapping]
"tweet" : {
"properties" : {
"message" : {"type" : "string"},
"tags" : {"type" : "string", "index_name" : "tag"},
"lists" : {
"properties" : {
"name" : {"type" : "string"},
"description" : {"type" : "string"}
}
}
}
}
[설명]
- elasticsearch 가 지원 하는 장점 중 하나 입니다.
- mapping 정보를 보면 문서 안에 sub 문서를 만들어 넣을 수 있습니다.
- _parent field 의 경우 index type 에 대한 parent 구조를 만들 수 있다고 하면 이건 document 자체에 parent-child 구조를 만들수 있습니다.
- mapping 에서 사용하는 index_name 의 경우 이런 array type 에 대해서 색인 시 field 명을 정의 할 수가 있습니다.
- nested loop 구조를 요구하는 문서가 있을 경우 잘 활용 하시면 좋습니다.
- 예를 들면 대화방이 있고 대화방안에는 여러 사람들이 나눈 대화 목록이있을 경우
"chat_room" : {
"properties" : {
"room_id" : {.....},
........
"chat_lists" : {
"properties" : {
"chat_id" : {....},
"sender" : {....},
"receiver" : {....},
"message" : {....)
}
}
}
}
. 이와 같은 구조로 생성을 할 수도 있습니다.
[Object/Nested]
- 이 두가지 type 도 array 와 유사 합니다.
- array 의 경우 [] 이와 같이 사용했다면, object 는 {} 을 사용하게 됩니다.
- nested 타입은 정의한 field 형식의 집합을 구성하게 됩니다. object 로 정의한 형식이 있다면 이것을 여러개의 집합으로 구성을 하게 됩니다.
아래 원문에 나온 예제를 보시면 쉽게 이해가 됩니다.
[Object 예제]
"person" : {
"properties" : {
"name1" : {
"type" : "object",
"path" : "just_name",
"properties" : {
"first1" : {"type" : "string"},
"last1" : {"type" : "string", "index_name" : "i_last_1"}
}
},
"name2" : {
"type" : "object",
"path" : "full",
"properties" : {
"first2" : {"type" : "string"},
"last2" : {"type" : "string", "index_name" : "i_last_2"}
}
}
}
}
- path 는 두가지 옵션을 갖습니다.
. just_name 과 full
. just_name 의 경우 mapping 에서 정의한 index_name 을 사용하게 되며
. full 의 경우 mapping 에서 정의한 full name 을 사용하게 됩니다.
- 즉 원문에 나온 결과를 보시면 이해가 쉽습니다.
JSON Name | Document Field Name |
---|
name1 /first1 | first1 |
name1 /last1 | i_last_1 |
name2 /first2 | name2.first2 |
name2 /last2 | name2.i_last_2 |
[Nested 예제]
{
"type1" : {
"properties" : {
"obj1" : {
"type" : "nested"
}
}
}
}
- 위 예제에서는 "obj1" 내부 field 정의가 빠져 있으나 설정이 가능 합니다.
- 아래와 같이 하시면 됩니다.
"obj1" : {
"type" : "nested",
"properties" : {
"first_name" : { "type" : "string", ....},
"last_name" : { "type" : "string", ....}
......
}
}