Golangʕ◔ϖ◔ʔ의 처음부터 전체 텍스트 검색 엔진(그냥 장난감)
다음을 수행하여 docker 네트워크(omochi_network)를 만듭니다.
$ docker network create omochi_network
Omochi는 Inverted Indexes & Documents를 저장하기 위해 MariaDB를 사용하고 ORM을 위해 Ent를 사용합니다.
데이터베이스 마이그레이션의 경우 다음을 통해 Docker 컨테이너 셸을 연결합니다.
$ docker-compose run api bash
그런 다음 다음을 통해 데이터베이스 마이그레이션을 실행합니다.
$ go run ./cmd/migrate/migrate.go
검색 엔진을 사용해보기 위해 이 프로젝트에서는 TSV 형식의 샘플로 두 개의 데이터 세트를 제공합니다.
영어용 데이터세트는 Movie title 데이터세트 이고, 일본어용 데이터세트는 Doraemon comic title 데이터세트 입니다.
먼저 다음과 같이 docker 컨테이너 셸을 연결합니다.
$ docker-compose run api bash
그런 다음 다음을 통해 데이터를 시드합니다.
$ go run {path to seed.go}
일본어 데이터 세트로 초기화하는 경우 {path to seed.go}
는 ./cmd/seeds/ja/seed.go
여야 합니다. 반면, 영어의 경우 ./cmd/seeds/eng/seed.go
입니다.
설정을 완료한 후 다음을 실행하여 애플리케이션을 시작할 수 있습니다.
$ docker-compose up
이 앱은 RESTful API를 시작하고 포트 8081에서 연결을 수신합니다.
데이터를 시드한 후 /v1/document/search
에 GET 요청을 보내 문서를 검색할 수 있습니다.
쿼리 매개변수는 다음과 같습니다.
"keywords"
: 검색할 키워드입니다. 검색어가 여러 개인 경우 "hoge,fuga,piyo"
와 같이 쉼표로 구분하여 지정하세요."mode"
: 검색 모드입니다. 지정할 수 있는 검색 모드는 "And"
와 "Or"
입니다. 도라에몽 만화 제목 데이터세트 로 데이터를 시드한 후 다음 방법으로 "draえもん"이 포함된 문서를 검색할 수 있습니다.
$ curl "http://localhost:8081/v1/document/search?keywords=ドラえもん" | jq .
{
"documents": [
{
"id": 12054,
"content": "ドラえもんの歌",
"tokenized_content": [
"ドラえもん",
"歌"
],
"created_at": "2022-07-08T12:59:49+09:00",
"updated_at": "2022-07-08T12:59:49+09:00"
},
{
"id": 11992,
"content": "恋するドラえもん",
"tokenized_content": [
"恋する",
"ドラえもん"
],
"created_at": "2022-07-08T12:59:48+09:00",
"updated_at": "2022-07-08T12:59:48+09:00"
},
{
"id": 11230,
"content": "ドラえもん登場!",
"tokenized_content": [
"ドラえもん",
"登場"
],
"created_at": "2022-07-08T12:59:44+09:00",
"updated_at": "2022-07-08T12:59:44+09:00"
},
...
영화 제목 데이터 세트를 기준으로 데이터 시딩을 수행한 후 다음을 통해 "장난감" 및 "스토리"가 포함된 문서를 검색할 수 있습니다.
$ curl "http://localhost:8081/v1/document/search?keywords=toy,story&mode=And" | jq .
{
"documents": [
{
"id": 1,
"content": "Toy Story",
"tokenized_content": [
"toy",
"story"
],
"created_at": "2022-07-08T13:49:24+09:00",
"updated_at": "2022-07-08T13:49:24+09:00"
},
{
"id": 39,
"content": "Toy Story of Terror!",
"tokenized_content": [
"toy",
"story",
"terror"
],
"created_at": "2022-07-08T13:49:34+09:00",
"updated_at": "2022-07-08T13:49:34+09:00"
},
{
"id": 83,
"content": "Toy Story That Time Forgot",
"tokenized_content": [
"toy",
"story",
"time",
"forgot"
],
"created_at": "2022-07-08T13:49:53+09:00",
"updated_at": "2022-07-08T13:49:53+09:00"
},
{
"id": 213,
"content": "Toy Story 2",
"tokenized_content": [
"toy",
"story"
],
"created_at": "2022-07-08T13:50:35+09:00",
"updated_at": "2022-07-08T13:50:35+09:00"
},
{
"id": 352,
"content": "Toy Story 3",
"tokenized_content": [
"toy",
"story"
],
"created_at": "2022-07-08T13:51:23+09:00",
"updated_at": "2022-07-08T13:51:23+09:00"
}
]
}
MIT