본 프로젝트는 postgres 문자열 검색 기능 사용을 위한 tsvector, tsquery 의 간략한 사용예시를 다룹니다.
아래 순서에 따라 데이터를 구축합니다.
일부 환경에 따라 관리자 권한으로 실행해야할 수 있습니다. (sudo su)
npm i
db 접속 정보를 설정합니다. example 파일값을 토대로 .env 파일을 수정하세요.
cp .env.example .env
아래 명령어로 데이터를 db에 구축하는 스크립트를 실행합니다.
npx ts-node script.ts
- AND(&) : & 사이에 속한 조건들이 모두 부합한 대상을 필터링 합니다. 예를 들어
세종특별시 & 호려울로로 조회하면세종특별시와호려울로가 모두 포함되어 있는 tsvector 값으로 필터링합니다. - OR(|) : | 사이에 속한 조건들 중 1개라도 부합하면 됩니다. 예를 들어
호려울로 | 대평로로 조회하면,호려울로와대평로가ㅣ 모두 포함되어 있는 tsvector 값으로 필터링합니다. - NOT(!) : 단어 앞에 붙이며, 해당 조건에 부합하지 않는 항목을 대상으로 조회합니다. 예를 들어
!대평시장의 결과 값은대평시장을 포함하지 않습니다. - FOLLOWED BY(<->) : 앞 뒤 단어의 순서 일치여부를 따집니다. 예를 들어
세종특별시 <-> 호려울로로 조회하면세종특별시다음에호려울로순으로 정의된 tsvector 값을 필터링합니다.
세종특별시 & 호려울로 와 호려울로 & 세종특별시 는 같은 결과가 조회됩니다.
세종특별시 <-> 호려울로 와 호려울로 <-> 세종특별시 는 조회 결과가 다릅니다.
SELECT rnaddrkor."road_address_id",
rnaddrkor."city_name",
rnaddrkor."district_name",
rnaddrkor."road_name"
FROM rnaddrkor
WHERE to_tsvector('simple', rnaddrkor."city_name" || ' '
|| rnaddrkor."district_name" || ' '
|| rnaddrkor."road_name") @@ to_tsquery('세종:* & (호려울로 | 대평:*) & !대평시장:*')
| road_address_id character varying | city_name character varying | district_name character varying | road_name character varying | |
|---|---|---|---|---|
| 1 | 36110103335079400000900000 | 세종특별자치시 | 호려울로 | |
| 2 | 36110103335079400001900000 | 세종특별자치시 | 호려울로 | |
| 3 | 36110103335079400002900000 | 세종특별자치시 | 호려울로 | |
| 4 | 36110103335079400004200000 | 세종특별자치시 | 호려울로 | |
| 5 | 36110103335079400004500000 | 세종특별자치시 | 호려울로 | |
| 6 | 36110103335079400005100000 | 세종특별자치시 | 호려울로 | |
| 7 | 36110104335079500000300000 | 세종특별자치시 | 대평로 | |
| 8 | 36110104335079500002700000 | 세종특별자치시 | 대평로 | |
| 9 | 36110104335079500003400000 | 세종특별자치시 | 대평로 | |
| 10 | 36110104335079500005600000 | 세종특별자치시 | 대평로 | |
| 11 | 36110104335079500007100000 | 세종특별자치시 | 대평로 | |
| 12 | 36110104335079500007500000 | 세종특별자치시 | 대평로 | |
| 13 | 36110104335079500008000000 | 세종특별자치시 | 대평로 | |
| 14 | 36110104335079500008300000 | 세종특별자치시 | 대평로 | |
| 15 | 36110104335079500008600000 | 세종특별자치시 | 대평로 | |
| 16 | 36110104335079500008700000 | 세종특별자치시 | 대평로 | |
| 17 | 36110104485319100001000000 | 세종특별자치시 | 대평1길 | |
| 18 | 36110104485319100001700000 | 세종특별자치시 | 대평1길 | |
| 19 | 36110104485319100001900000 | 세종특별자치시 | 대평1길 | |
| 20 | 36110104485319100002200000 | 세종특별자치시 | 대평1길 | |
| 21 | 36110104485319100002700000 | 세종특별자치시 | 대평1길 | |
| 22 | 36110104485319100003700000 | 세종특별자치시 | 대평1길 | |
| 23 | 36110104485319100003800000 | 세종특별자치시 | 대평1길 | |
| 24 | 36110104485319300001000000 | 세종특별자치시 | 대평3길 | |
| 25 | 36110104485319300001700000 | 세종특별자치시 | 대평3길 | |
| 26 | 36110104485319300001800000 | 세종특별자치시 | 대평3길 | |
| 27 | 36110104485510800001700000 | 세종특별자치시 | 대평4길 | |
| 28 | 36110104485510800003300000 | 세종특별자치시 | 대평4길 |
https://www.postgresql.org/docs/current/datatype-textsearch.html https://www.postgresql.org/docs/current/textsearch-intro.html#TEXTSEARCH-DOCUMENT