본 프로젝트는 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