https://github.com/ddochea0314/example-postgres-text-search-types
본 프로젝트는 postgres 문자열 검색 기능 사용을 위한 tsvector, tsquery 의 간략한 사용예시를 다룹니다.
https://github.com/ddochea0314/example-postgres-text-search-types
example postgres postgresql tsquery tsvector
Last synced: 24 days ago
JSON representation
본 프로젝트는 postgres 문자열 검색 기능 사용을 위한 tsvector, tsquery 의 간략한 사용예시를 다룹니다.
- Host: GitHub
- URL: https://github.com/ddochea0314/example-postgres-text-search-types
- Owner: ddochea0314
- Created: 2023-07-11T02:01:12.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2023-07-15T08:47:22.000Z (almost 3 years ago)
- Last Synced: 2025-04-04T15:52:47.250Z (about 1 year ago)
- Topics: example, postgres, postgresql, tsquery, tsvector
- Language: TypeScript
- Homepage: https://ddochea.tistory.com/235
- Size: 377 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# example-postgres-text-search-types
본 프로젝트는 postgres 문자열 검색 기능 사용을 위한 `tsvector`, `tsquery` 의 간략한 사용예시를 다룹니다.
# 데이터 초기 구축하기
아래 순서에 따라 데이터를 구축합니다.
> 일부 환경에 따라 관리자 권한으로 실행해야할 수 있습니다. (sudo su)
## 1. npm 인스톨 명령어 실행
```
npm i
```
## 2. env 설정
db 접속 정보를 설정합니다. example 파일값을 토대로 `.env` 파일을 수정하세요.
```
cp .env.example .env
```
## 3. 데이터 insert 처리
아래 명령어로 데이터를 db에 구축하는 스크립트를 실행합니다.
```
npx ts-node script.ts
```
# tsquery 연산자 종류
- AND(&) : & 사이에 속한 조건들이 모두 부합한 대상을 필터링 합니다. 예를 들어 `세종특별시 & 호려울로` 로 조회하면 `세종특별시` 와 `호려울로`가 모두 포함되어 있는 tsvector 값으로 필터링합니다.
- OR(|) : | 사이에 속한 조건들 중 1개라도 부합하면 됩니다. 예를 들어 `호려울로 | 대평로` 로 조회하면, `호려울로` 와 `대평로`가ㅣ 모두 포함되어 있는 tsvector 값으로 필터링합니다.
- NOT(!) : 단어 앞에 붙이며, 해당 조건에 부합하지 않는 항목을 대상으로 조회합니다. 예를 들어 `!대평시장` 의 결과 값은 `대평시장`을 포함하지 않습니다.
- FOLLOWED BY(<->) : 앞 뒤 단어의 순서 일치여부를 따집니다. 예를 들어 `세종특별시 <-> 호려울로` 로 조회하면 `세종특별시` 다음에 `호려울로` 순으로 정의된 tsvector 값을 필터링합니다.
# AND(&) 와 FOLLOWED BY(<->) 차이점
`세종특별시 & 호려울로` 와 `호려울로 & 세종특별시` 는 같은 결과가 조회됩니다.
`세종특별시 <-> 호려울로` 와 `호려울로 <-> 세종특별시` 는 조회 결과가 다릅니다.
# 조회 예시
```
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