6.4.3 Pattern Replace

이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍니다.

Pattern Replace 캐릭터 필터는 정규식(Regular Expression)을 이용해서 좀더 복잡한 패턴들을 치환할 수 있는 캐릭터 필터입니다. 다음은 카멜 표기법(camelCase)으로 된 단어를 대문자가 시작하는 단위 마다 공백을 삽입하여 세부 단어별로 토크나이징 될 수 있도록 camel 인덱스에 camel_analyzer 라는 애널라이저를 생성하는 예제입니다.

camel 인덱스에 pattern_replace 캐릭터 필터 설정
PUT camel
{
"settings": {
"analysis": {
"analyzer": {
"camel_analyzer": {
"char_filter": [
"camel_filter"
],
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
},
"char_filter": {
"camel_filter": {
"type": "pattern_replace",
"pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
"replacement": " "
}
}
}
}
}

이제 camel 인덱스에서 "FooBazBar" 라는 단어를 분석 해 보면 다음과 같이 foo, baz, bar 세개의 단어로 분리되는 것을 확인할 수 있습니다.

request
response
request
camel_analyzer 애널라이저로 문장 분석
GET camel/_analyze
{
"analyzer": "camel_analyzer",
"text": [
"public void FooBazBar()"
]
}
response
camel_analyzer 애널라이저로 문장 분석 결과
{
"tokens" : [
{
"token" : "public",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "void",
"start_offset" : 7,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "foo",
"start_offset" : 12,
"end_offset" : 14,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "baz",
"start_offset" : 15,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "bar",
"start_offset" : 18,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}

캐릭터 필터는 토크나이저가 적용되기 이전에 해당 필드 전체 내용을 치환하는 일종의 전처리 작업입니다. 유사한 기능을 구현하여 적용하더라도 뒤에 나올 토큰필터에서 텀을 처리하는 것과는 결과에 있어 position 같은 값들의 차이가 생깁니다.