Elasticsearch (ELK)/Elasticsearch

8-3. 멀티 필드 - Multi Field

Velody 2020. 5. 29. 10:58

설정 

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "nori_analyzer": {
          "tokenizer": "nori_tokenizer"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "message": {
        "type": "text",
        "fields": {
          "english": {
            "type": "text",
            "analyzer": "english"
          },
          "nori": {
            "type": "text",
            "analyzer": "nori_analyzer"
          }
        }
      }
    }
  }
}

위와 같이 매핑을 정의하면 도큐먼트에는 message 필드값만 있어도 message, message.english, message.nori 총 3개의 역 색인이 생성됩니다. 위의 인덱스에 { "message": "My favorite 슈퍼영웅 is Iron Man" } 이라는 값을 입력하면 다음과 같이 3개의 역 색인이 생성됩니다.

 

message.english 에는 "favorite" 가 형태소 분석이 되어 "favorit" 로 저장되었습니다. message.nori 에는 "슈퍼영웅" 이 한글로 분석되어 "슈퍼", "영웅" 으로 분리되어 저장되었습니다. 즉 match 쿼리를 할 때 "messages": "영웅" 으로는 검색이 안되지만 "messages.nori": "영웅" 으로 검색하면 검색이 됩니다.

 

// message 역 색인에서 "영웅" 검색
GET my_index/_search
{
  "query": {
    "match": {
      "message": "영웅"
    }
  }
}

// message.nori 역 색인에서 "영웅" 검색
GET my_index/_search
{
  "query": {
    "match": {
      "message.nori": "영웅"
    }
  }
}

멀티 필드는 한 필드에 여러 애널라이저를 적용해야 하는 경우, 특히 다국어로 씌여진 도큐먼트를 분석해야 할 때 매우 유용합니다.