Text and Keyword 타입
Text 타입
전문(full text) 형식과 같은 문자열 (ex. Mail) 을 색인 할 때는 필드에 text 타입을 적용한다. 해당 타입으로 설정된 필드는 기본적으로 analyzed 속성이며, 'Analyzer'를 통해서 문자열이 각각 분리된 토큰으로 인덱스에 색인 된다. 따라서 메일 본문과 같이 큰 문자열 덩어리를 가지고 있는 document를 그 본문안의 각각 단어로 검색 할 수 있게 해 준다. (이른바 'Full Text Search'..)
다만 해당 필드를 'sorting' 작업에 사용할 경우, 메모리 점유와 성능 문제를 가져온다. 때문에 sorting 작업엔 거의 사용하지 않지만, 일반적으로 'aggregation' 작업에는 성능에 유의 하면서 사용을 하는 편인 것 같다. 예를 들어서 Text타입 인 message필드가 있다고 하면.
"message" : "Apr 20 10:01:00 localhost haproxy[15567]: [20/Apr/2020:10:01:00 +0900] client : 10.10.2.101:6673 --- front(fce-pxy-01) : GET 100.10.20.2:8080/paral kkkApi/v7/CO/xx/K_5_KZ_K_All.ENGINE.FACE/page?user=%7B306D3688-CC4A-11E8%7D HTTP/1.1 --- backend(face) : 10.10.20.2:54252 --- server(fff-bmt-srv-01) : 10.10.20.8:8080 --- status : 200 --- response_time : 1 ms --- size : 6019 B"
Text타입이면 Full Text Search 가 가능하므로, 아래와 같은 쿼리가 가능하다. 아래 쿼리는 (FACE 와 status : 200)이 존재 하고, ("size : 223 B" OR "size : 217 B" OR "size : 209 B")이 존재안하는 로그를 찾는것이다.
GET filebeat-*/_search
{
"query": {
"query_string" : {
"fields": ["message"],
"query": "*.FACE* AND \"status : 200\" AND NOT (\"size : 223 B\" OR \"size : 217 B\" OR \"size : 209 B\")"
}
}
}
Keyword 타입
정형화된 문자열 컨텐츠 (ex. Email 주소, 이름, 버전, 우편번호 등등..) 를 색인할 경우엔 해당 필드에 keyword 타입을 적용한다. 해당 타입의 필드는 일반적으로 아래와 같은 경우에 사용하게 된다.
- 검색 시 Filtering
- Sorting
- Aggregation 다만 keyword 타입의 필드는 Analyze 되지 않기 때문에, 문자열 값 자체로만 검색 할 수 있다. 예를들어, Hello World 라는 문자열이 색인됬다고 가정했을때, Hello World 으로만 검색이 가능하다. Hello 로는 검색이 안된다. 정 하고 싶으면, 정규식 을 써서 복잡한 검색을 할수 있다.
# 버전이 12로 시작하고, 0001로 끝나는 로그를 조회
GET index-action-json-2019.10.18/_search
{
"query": {
"query_string": {
"query": "ver: /12.+&.+0001/"
}
}
}
# 버전이 12로 시작하고, 110으로 끝나지 않는 로그를 조회
GET index-action-json-2019.10.18/_search
{
"query": {
"query_string": {
"query": "ver: /12.+&~(.+110)/"
}
}
}