엘라스틱 서치는 인덱스가 생성되어있지 않은 상태에서도 데이터를 입력하면
자동으로 인덱스가 생성이 된다.
GET books/_mapping
DELETE books
// books에 새로운 필드 추가하기
PUT books/_mapping
{
"properties": {
"content": {
"type" : "text"
}
}
}
text는 역인덱스를 생성하지만 keyword 는 역인덱스를 생성하지 않고 토큰을 텀으로 분리하지 않고 그대로 저장을 하게된다.
PUT books/_doc/1
{
"title": "Romeo and Juliet",
"author": "William Shakespeare",
"category": "Tragedies",
"publish_date": "1562-12-01T00:00:00",
"pages": 125
}
keyword 는 역인덱스 과정을 거치지 않고
하나의 토큰으로 저장을 한다.
"category" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
category는 필드가 text 타입으로 되어있고
하위 타입으로 keyword로 되어 있는데
검색 할 때 category.keyword 라고 검색을 하게 되면
Romeo and Juliet 이라고 검색을 해야만
도큐먼트를 찾을 수가 있다. 대소문자 하나라도 일치 해야함.
GET books/_search
{
"query": {
"match": {
"title.keyword": "Romeo and Juliet"
}
}
}
text를 사용하는 때는 무언가를 집계를 할 때 사용한다. 예를 들어 로미오와 줄리엣이라는 소설과 로미오와 스칼렛이라는 소설이 있다고 했을 때 로미오라는 단어로 집계를 하게 되면 로미오와 줄리엣 그리고 로미오와 스칼렛 2개로 집계를 하는 것이 됨.
"mappings" : { "properties" : { // 하위필드가 존재하므로 author.keyword로 검색이 가능하다. "author" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "category" : { // 카테고리는 키워드 타입으로만 저장 "type" : "keyword" }, "pages" : { // 자원을 아껴야 하니까 Integer로 변경 "type" : "integer" }, "publish_date" : { "type" : "date" }, "title" : { "type" : "text" } } }
PUT books { "mappings" : { "properties" : { "author" : { "type" : "text", "fields" : { "full" : { "type" : "keyword", "ignore_above" : 256 }, "nori" : { "type" : "text", "analyzer": "nori" } } }, "category" : { "type" : "keyword" }, "pages" : { "type" : "integer" }, "publish_date" : { "type" : "date" }, "title" : { "type" : "text" } } } }
이런것도 가능하다.
keyword 하위 필드를 사용하여 검색을 한다.
GET books/_search
{
"query": {
"match": {
"author.keyword": "William Shakespeare"
}
}
}
GET number_test/_search
PUT number_test/_doc/1
{
"value": 1
}
coerce 를 적용하지 않는 경우 3도 들어가고 "2" 도 들어가고 "3.3" 도 들어가게 된다.
만약 타입이 Integer인 경우에는 "3.3" 은 3으로 정수 타입으로 변환되어 저장되게 된다.
이렇게 es 가 유연하게 알아서 값을 변경하여 적용되는 것을 막는 옵션이 coerce 라는 옵션이다.
// 타입이 다른 경우 값을 집어 넣지 않는다.
PUT number_test
{
"mappings": {
"properties": {
"value": {
"type": "integer",
"coerce": false
}
}
}
}