2018년 3월 11일 일요일

Elasticsearch의 특수문자 검색

가끔 엘라스틱서치에서 특수문자를 검색하고 싶을 때가 있는데 잘 안 된다. 다음은 var 필드에서 특수문자 '='을 포함한 모든 문자열을 검사하는 '*=*'의 검색 결과.

'var:*=*' 검색 결과

검색 결과가 없는 이유는 엘라스틱서치가 인덱싱 과정에서 특수문자를 대부분 '공백' 취급해버리기 때문.

다음은 문자열 'a=d'의 인덱싱 결과. 'a'와 'd'가 분리 색인된다. 결과적으로 전체 문자열은 'a=d'이지만, 'a' 또는 'd' 입력만으로 'a=d'를 검색할 수 있다. 단어 단위 검색(Full Text Search)이 가능해진 것.

'a=d'의 인덱싱 결과

'5=5'를 입력해보자. 결과 문자열 중 '5'만 하이라이트 표시가 생긴다. '='을 제외한 문자 '5'만 색인 검색을 했다는 뜻.

'var:5=5' 검색 결과

이때 검색 결과는 '5'를 두번 검색(var:5 OR var:5)한 결과. '5=6'을 입력하면 '5'와 '6' 모두 검색(var:5 OR var:6)한다.

'var:5=6' 검색 결과

결과적으로 '5=5'의 검색 결과는 그냥 '5'만 입력했을 때와 같다. 

'var:5' 검색 결과

특이하게 검색어들이 특수문자로 연결돼 있으면 검색 범위가 같은 필드로 제한된다. 다음은 검색어 'var:5#%$@6'의 검색 결과. '5=6'의 검색 결과와 같다.

'var:5#%$@' 검색 결과

그러나 검색어 사이에 '공백'이 있는 'var:5 5'의 검색 결과는 사뭇 다르다. 첫번째 검색어 '5'는 'var' 필드에서, 두번째 검색어 '5'는 모든 필드에서 검색한 결과. (var:5 OR 5)

'var:5 5' 검색 결과

아 그래서 특수문자는 어떻게 검색하냐고! 'timelion의 필드 집계 오류'에서 언급했었지만, 엘라스틱서치는 색인이 없는 필드를 하나 더 가지고 있다. 다음은 해당 필드 검색 결과.

'var.keyword:*=*' 검색 결과

keyword 필드 검색은 SQL의 Like 검색과 같아서, 데이터 전체를 뒤지는 과정에서 성능 저하가 발생할 수 있지만, 이렇게라도 되는 게 어디냐 싶다.

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스