Elasticsearch에서 특수문자 검색
가끔 엘라스틱서치에서 특수문자를 검색하고 싶을 때가 있는데 잘 안 된다. 다음은 var 필드에서 특수문자 '='을 포함한 모든 문자열을 검사하는 '*=*'의 검색 결과.
검색 결과가 없는 이유는 엘라스틱서치가 인덱스 색인을 만드는 과정에서 특수문자를 '공백' 취급해버리기 때문. 다음은 문자열 'a=d'의 인덱싱 결과. 'a'와 'd'가 분리 색인된다. 결과적으로 전체 문자열은 'a=d'이지만, 'a' 또는 'd' 입력만으로 'a=d' 검색이 가능해진다. 단어 단위 검색(Full Text Search)이 가능해진 것.
'5=5'를 입력해보자. 결과 문자열 중 '5'만 하이라이트 표시가 생긴다. '='을 제외한 문자 '5'만 색인 검색을 했다는 뜻.
이때 검색 결과는 '5'를 두번 검색(var:5 OR var:5)한 결과. '5=6'을 입력하면 '5'와 '6' 모두 검색(var:5 OR var:6)한다.
특이하게 검색어들이 특수문자로 연결돼 있으면 검색 범위가 같은 필드로 제한된다. 다음은 검색어 'var:5#%$@6'의 검색 결과. '5=6'의 검색 결과와 같다.
그러나 검색어 사이에 '공백'이 있는 'var:5 5'의 검색 결과는 사뭇 다르다. 다음 첫번째 검색어 '5'는 'var' 필드에서, 두번째 검색어 '5'는 모든 필드에서 검색한 결과. (var:5 OR 5)
아 그래서 특수문자는 어떻게 검색하냐고! 전에 'timelion 필드 집계 오류'란 글에서 언급했었지만, 엘라스틱서치는 색인이 없는 필드를 하나 더 가지고 있다. 다음은 해당 필드 검색 결과.
keyword 필드 검색은 SQL의 Like 검색과 같아서, 데이터 전체를 뒤지는 과정에서 발생하는 성능 저하는 어쩔 수 없지만, 나름 쓸만하지 않나 싶다.