_mappings

3019 단어 ESES

엘라스틱 서치는 인덱스가 생성되어있지 않은 상태에서도 데이터를 입력하면
자동으로 인덱스가 생성이 된다.

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
}
}
}
}

좋은 웹페이지 즐겨찾기