_mappings

LEE_DEV_LOG·2022년 2월 6일
0

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

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

profile
LEE_DEV_LOG

0개의 댓글