7.3 멀티 (다중) 필드 - Multi Field
이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민([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!
멀티 필드는 한 필드에 여러 애널라이저를 적용해야 하는 경우, 특히 다국어로 씌여진 도큐먼트를 분석해야 할 때 매우 유용합니다.
이번 장에서는 인덱스가 가지는 settingsmappings 의 설정 방법, 그리고 여러 종류의 필드 타입 들에 대해서 알아보았습니다. 많은 내용을 다루었지만 아직도 설명하지 못한 인덱스의 또다른 많은 설정들이 있습니다. 항상 공식 도큐먼트를 같이 참고 하시기 바랍니다.
Copy link