Old Branch

Elastic Search field 와 field.keyword의 차이

woolbro 2020. 5. 28. 11:00
반응형

Elastic Search field 와 field.keyword의 차이

  • Elastic search의 index pattern에는 여러가지가 있지만 인덱스를 생성하고 데이터를 집어 넣고 보면 같은 필드 이름에 keyword가 붙어있는 것을 볼 수 있다.

  • Elasitc Search 5 버전 이후로 String은 text,keyword로 분리 되었다.

Example Index

{
  "인덱스_이름": {
    "mappings": {
      "properties": {
        "필드_이름_1": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "필드_이름_2": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "필드_이름_3": {
          "type": "long"
        },
        "필드_이름_4": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

위의 예제를 보면

필드_이름_1, 필드_이름_2, 필드_이름_4

type이 text로 되어있고, 밑의 필드에 keyword가 추가 되어 있다.

언뜻 보기엔 차이가 없어 보이지만, 검색을 할 때에 영향을 주는 친구이니 알아보도록 하자

Fields ?! Fields.keyword

Fields

text (Fields)인 경우에는 형태소 기반으로 분리한다고 한다.

즉, text인 경우에는 단어 혹은 일부만 검색해도 포함 된 전문 검색이 가능하다.

타입을 선언하고, 데이터를 넣은 후 검색을 시도 해 보면 아래와 같다.

  1. REST의 PUT으로 mapping을 추가

     #1 mapping 정의
     PUT test_data
     {
       "mappings": {
         "_doc": {
           "properties": {
             "name": {
               "type": "text"
             }
           }
         }
       }
     }
  2. POST로 document(data) 삽입

     #2 insert value
     POST products/_doc
     {
       "name": "developer wool"
     }
  3. GET으로 document를 검색한다.

     #3 search
     GET products/_search
     {
       "query": {
         "match": {
           "name": "wool"
         }
       }
     }

검색한 결과가 나온다.

Fields.keyword

text.keyword 인 경우에는 exact value가 필요하다.

완전 동일한 단어를 검색 해야 검색이 가능하다.

  1. REST의 PUT으로 mapping을 추가

     #1 mapping 정의
     PUT test_data
     {
       "mappings": {
         "_doc": {
           "properties": {
             "name": {
               "type": "keyword"
             }
           }
         }
       }
     }
  2. POST로 document(data) 삽입

     #2 insert value
     POST products/_doc
     {
       "name": "developer wool"
     }
  3. GET으로 document를 검색한다.

     #3 search
     GET products/_search
     {
       "query": {
         "match": {
           "name": "wool"
         }
       }
     }

 

 

Reference

  • elastic search official documents

https://www.elastic.co/kr/blog/strings-are-dead-long-live-strings

 

Elasticsearch replaces string type with two new types text and keyword.

On using text types for full text search and keyword type for keyword search in Elasticsearch 5.0.

www.elastic.co