회사에서 elastic를 사용하게 되면서, 나는 elastic에 쿼리를 던져야하는 일이 많아졌다. laravel 과 함께 쓰면서 처음에는 생쿼리로 짜서 elastic에 요청을 보냈으나, laravel-scout 라는 패키지를 알게 되면서 이것과 함께 laravel-scout를 기반으로 하면서 elastic 검색을 편하게 해주는 https://github.com/babenkoivan/scout-elasticsearch-driver ← 이 패키지를 알게 되었다. 그래서 리팩토링을 진행했는데, 회사분이 어떤 full text query를 쓰고 있냐고 묻는 것이다. 그래서 까봤다.
*조건) 전역검색 : blue, 특정조건 : cdn_category=FEMALE, 소팅 : sale_count asc 기준, offset : 0, limit : 100
음 laravel eloquent에서 주로 사용하는 get()
으로 데이터를 가져오고 싶은데 자꾸 no driver...
라는 에러가 생겼다. ㅠㅠ 이건 아직도 해결을 못하는중...일단은 raw()
로 사용하면 작동이 되서 해당 메소드로 데이터 가져오는중이다.
일단 진짜 자랑스러우면서 허탈한게... 내가 처음에 생으로 짜놓은 쿼리 코드랑 똑같다 ㅠㅠ 나 잘했다 증맬루.. full text query는 query_string을 사용하고 있고, 조건들은 filter context를 사용하고 있었다.
여기서 또 깊게 나가보니 filter와 query context 의 차이를 잘 알고있지 않은 것 같았다.
여기저기 찾아보니 아래처럼 정리가 되더라
Contexts
query | filter |
---|---|
해당 문서가 다른 문서보다 적합함(관련성 체크) | 문서가 조건과 일치하거나 일치하지 않음 |
전체 텍스트 검색 | 정확한 값 검색(특정필드 지정가능) |
score* 존재 | score가 없음 |
X | 필터의 결과를 자동으로 캐시 |
*score : 관련성 점수
별거 없는 정리같지만 생각보다 저 특징들이 쿼리문을 어떤걸 써야될지에 대해 잡아주는 큰 방향 역할을 해줘서 큰 도움이 됐다. 관련성 점수 또는 전체 텍스트 검색이 필요하지 않는 한 항상 필터를 사용하는 것이 좋다고 한다.