이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민([email protected])에게 사용 내용을 알려주시기 바랍니다.
Elasticsearch 의 도큐먼트에는 하나의 필드값만 있지만 이 필드의 값을 여러 개의 역 색인 및 doc_values 들로 저장할 수 있는 다중 필드, 즉 멀티 필드 기능이 있습니다. 사실 이 내용은 앞에서 이미 여러 번 나왔습니다. 사용 방법은 다음과 같이 매핑에서 필드명 아래에 "fields" : { } 항목에서 다시 새로운 필드를 정의하고 설정합니다.
멀티 필드 설정
1
PUT my_index
2
{
3
"mappings":{
4
"properties":{
5
"<필드명1>":{
6
"type":"text",
7
"fields":{
8
"<필드명2>":{
9
"type":"<타입>"
10
}
11
}
12
}
13
}
14
}
15
}
Copied!
보통은 text 타입 아래에 keyword 타입을 같이 정의하기 위해서 사용됩니다. 다이나믹 매핑으로 문자열 값이 입력되면 자동으로 이런 모양으로 생성됩니다. 이 외에도 하나의 텍스트 필드에 여러 개의 애널라이저를 적용하기 위해서도 사용할 수 있습니다. 다음은 my_index 인덱스의 message 필드에 서로 다른 애널라이저들을 사용하는 english, nori 멀티 필드를 정의하는 예제입니다.
english, nori_analyzer 를 사용하는 message 의 멀티필드 정의
1
PUT my_index
2
{
3
"settings":{
4
"analysis":{
5
"analyzer":{
6
"nori_analyzer":{
7
"tokenizer":"nori_tokenizer"
8
}
9
}
10
}
11
},
12
"mappings":{
13
"properties":{
14
"message":{
15
"type":"text",
16
"fields":{
17
"english":{
18
"type":"text",
19
"analyzer":"english"
20
},
21
"nori":{
22
"type":"text",
23
"analyzer":"nori_analyzer"
24
}
25
}
26
}
27
}
28
}
29
}
Copied!
nori_analyzer 는 기본적으로 제공되는 애널라이저가 아니기 때문에 "settings" : { } 에서 만들어 줘야 합니다.
위와 같이 매핑을 정의하면 도큐먼트에는 message 필드값만 있어도 message, message.english, message.nori 총 3개의 역 색인이 생성됩니다. 위의 인덱스에 { "message": "My favorite 슈퍼영웅 is Iron Man" } 이라는 값을 입력하면 다음과 같이 3개의 역 색인이 생성됩니다.
message, message.english, message.nori 멀티 필드 역 색인
message.english 에는 "favorite" 가 형태소 분석이 되어 "favorit" 로 저장되었습니다. message.nori 에는 "슈퍼영웅" 이 한글로 분석되어 "슈퍼", "영웅" 으로 분리되어 저장되었습니다. 즉 match 쿼리를 할 때 "messages": "영웅" 으로는 검색이 안되지만 "messages.nori": "영웅" 으로 검색하면 검색이 됩니다.
request
response
message 역 색인에서 "영웅" 검색
1
GET my_index/_search
2
{
3
"query":{
4
"match":{
5
"message":"영웅"
6
}
7
}
8
}
Copied!
message 역 색인에서 "영웅" 검색 결과
1
{
2
"took":0,
3
"timed_out":false,
4
"_shards":{
5
"total":1,
6
"successful":1,
7
"skipped":0,
8
"failed":0
9
},
10
"hits":{
11
"total":{
12
"value":0,
13
"relation":"eq"
14
},
15
"max_score":null,
16
"hits":[]
17
}
18
}
Copied!
request
response
message.nori 역 색인에서 "영웅" 검색
1
GET my_index/_search
2
{
3
"query":{
4
"match":{
5
"message.nori":"영웅"
6
}
7
}
8
}
Copied!
message.nori 역 색인에서 "영웅" 검색 결과
1
{
2
"took":3,
3
"timed_out":false,
4
"_shards":{
5
"total":1,
6
"successful":1,
7
"skipped":0,
8
"failed":0
9
},
10
"hits":{
11
"total":{
12
"value":1,
13
"relation":"eq"
14
},
15
"max_score":0.2876821,
16
"hits":[
17
{
18
"_index":"my_index",
19
"_type":"_doc",
20
"_id":"1",
21
"_score":0.2876821,
22
"_source":{
23
"message":"My favorite 슈퍼영웅 is Iron Man"
24
}
25
}
26
]
27
}
28
}
Copied!
멀티 필드는 한 필드에 여러 애널라이저를 적용해야 하는 경우, 특히 다국어로 씌여진 도큐먼트를 분석해야 할 때 매우 유용합니다.
이번 장에서는 인덱스가 가지는 settings 와 mappings 의 설정 방법, 그리고 여러 종류의 필드 타입 들에 대해서 알아보았습니다. 많은 내용을 다루었지만 아직도 설명하지 못한 인덱스의 또다른 많은 설정들이 있습니다. 항상 공식 도큐먼트를 같이 참고 하시기 바랍니다.