결국 무엇이든 해내는 사람

ElasticSearch - 캐릭터 필터 매핑 ( char_filter ) 단어 치환 [ 예제, 설명 ] 본문

두서없는 공부 노트/ElasticSearch

ElasticSearch - 캐릭터 필터 매핑 ( char_filter ) 단어 치환 [ 예제, 설명 ]

kkm8257 2021. 12. 14. 15:14
반응형
-- Mapping 캐릭터 필터를 이용하면 지정단어를 다른 단어로 치환 가능
-- 특수문자를 포함하는 기능을 구현할려면 반드시 적용해야하므로 실제로 캐릭터 필터 중에선 가장 많이 사용함



POST coding/_bulk
{"index":{"_id":"1"}}
{"language":"Java"}
{"index":{"_id":"2"}}
{"language":"C"}
{"index":{"_id":"3"}}
{"language":"C++"}


-- 쿼리 질의시 C와C++ 두 개가 결과로 나온다
-- why??
-- 도큐먼트가 색인될 때 기본적으로 standard 애널라이저가 적용되면서 특수문자 C++에서 ++은 제거 되고 C는 소문자로 처리되면서
-- 실제 역 인덱스는 'c'가 저장되기 때문임
-- 그러므로 검색도 마찬가지로 C++ 을 검색하였으나( match 쿼리 ) standard 애널라이저가 적용되면서
-- C++ -> C -> c 이런식으로 검색어가 결정된 것

GET coding/_search
{
  "query": {
    "match": {
      "language": "C++"
    }
  }
}

-- standard 뿐 아니라 대다수의 애널라이저들이 특수문자에 대해서는 불용어로 간주하고 제거한다
-- 특수문자가 포함된 검색어들을 검색하려면 특수문자를 먼저 다른 문자로 치환해서 저장해야한다
-- 아래 예제는 + 기호를 단어로 치환해서 색인
-- ( 인덱스를 먼저 재생성 후 다시 벌크인서트 )

DELETE coding


-- char_filter 에 커스텀 필터 cpp_char_filter 가 있고, 타입은 mapping 이다.
-- mappings 에는 배열로 주어지며 치환할 단어들이 존재
PUT coding
{
  "settings": {
    "analysis": {
      "analyzer": {
        "coding_analyzer": {
          "char_filter": [
            "cpp_char_filter"
          ],
          "tokenizer": "whitespace",
          "filter": [ "lowercase", "stop", "snowball" ]
        }
      },
      "char_filter": {
        "cpp_char_filter": {
          "type": "mapping",
          "mappings": [ "+ => _plus_", "- => _minus_" ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "language": {
        "type": "text",
        "analyzer": "coding_analyzer"
      }
    }
  }
}


-- 위 인덱스 매핑 정보에서 애널라이저 등록 순서 흐름

-- "char_filter"에 등록된 "cpp_char_filter"를 먼저 작성해주고
-- "cpp_char_filter" 는 "analyzer" 밑에 "char_filter" 밑에 배열 안에 "cpp_char_filter"를 작성
-- 그러면 "mappings" 밑에 "properties" 밑에 필드 안에 "analyzer"에 위에서 등록해놓은 애널라이저 "coding_analyzer"를 사용 할 수 있다.














반응형
Comments