본문 바로가기

카테고리 없음

typesense 설치

반응형

현재(21.11.30) 가장 최신 버전은 0.21.0 입니다 참고하세요.

wget --trust-server-names https://dl.typesense.org/releases/0.17.0/typesense-server-0.17.0-amd64.deb
sudo apt install ./typesense-server-0.17.0-amd64.deb

 설치가 잘 되었는지 확인은

curl http://localhost:8108/health

{"ok":ture} 라면 정상적으로 설치와 실행이 되고 있는 상태입니다. 

 

국내가수

 

국내가수

시트1 name 강균성 강문경 강산에 강성훈 강승윤 강인봉 강진 강타 개리 견우 고복수 고운봉 고유진 구원찬 구윤회 구자명 국카스텐 권순일(가수) 권인하 기리보이 김건모 김규종 김경록 김경현

docs.google.com

위 구글 시트의 자료를 singer 콜렉션에 등록 하는 예제입니다. 

const Typesense = require('typesense')
const PublicGoogleSheetsParser = require('public-google-sheets-parser')
const parser = new PublicGoogleSheetsParser()

// collection 및 document 생성을 위한 client 준비
const client = new Typesense.Client({
  nodes: [{
    host: 'localhost',
    port: '8108',
    protocol: 'http'
  }],
  apiKey: ' cat /etc/typesense/typesense-server.ini --->>> api-key를 적어주세요. ',
  connectionTimeoutSeconds: 2
})

run = async() => {
  // 가수 인덱싱
  const collectionName = 'singer'
  const addressSchema = {
    'name': collectionName,
    'fields': [
      {'name': 'name', 'type': 'string' },
      {'name': 'index', 'type': 'int32' },

    ],
    'default_sorting_field': 'index'
  }
  await client.collections().create(addressSchema)


  // documents import 처리
  const rawAddress = await parser.parse('1wbRXuacGVqPU1XLt_jDqsdcyzDMVEyJ_ubYGh_Li924')
  console.log(rawAddress)
  const address = rawAddress.map(({ name }, index) => ({ name, index }))
  await client.collections(collectionName).documents().import(address, { action: 'create' })

  // documents가 잘 저장되었는지 테스트 쿼리 전송 및 결과 확인
  const searchParameters = {
    q: '김',
    query_by: 'name',
    per_page: 5,
  }
  const searchResult = await client.collections(collectionName).documents().search(searchParameters)
  console.log(searchResult)
}

run().then(()=>{console.log('done')});

fastify를 이용하여 검색 api 서버를 완성해보도록 하겠습니다. 

const httpErrors = require('http-errors')
const Typesense = require('typesense')
const fastifyStatic = require('fastify-static')
const path = require('path')
const typesenseClient = new Typesense.Client({
  nodes: [{
    host: 'localhost',
    port: '8108',
    protocol: 'http'
  }],
  apiKey: ' cat /etc/typesense/typesense-server.ini --->>> api-key를 적어주세요. ',
  connectionTimeoutSeconds: 2
})

const fastify = require('fastify')({ trustProxy: true })

// cors 허용을 위한 플러그인 등록
fastify.register(require('fastify-cors'))
fastify.register(fastifyStatic, {
  root: path.join(__dirname, '/')
})

/**
 * 가수이름 검색
 */
fastify.get('/singer/search', async function (request, reply) {
  const { keyword } = request.query
  if (!keyword) return reply.send(httpErrors.BadRequest('keyword is required'))


  const searchParameters = { q: keyword, query_by: 'name', per_page: 10 }
  const searchResults = await typesenseClient.collections('singer').documents().search(searchParameters)
  const result = searchResults.hits.map((res) => (res.highlights[0] || {}).snippet || res.document.id)
  return reply.send(result)
})

/**
 * test용 html
 */
fastify.get('/', async function (request, reply) {

  return reply.sendFile('index.html')
})


fastify.get('/singer/add', async function (request, reply) {
  const { keyword } = request.query
  if (!keyword) return reply.send(httpErrors.BadRequest('keyword is required'))

  const searchParameters = { q: keyword, query_by: 'name', per_page: 10 }

  let document = {
  'name': keyword,
    }

  await typesenseClient.collections('singer').documents().create(document)
  const searchResults = await typesenseClient.collections('singer').documents().search(searchParameters)
  const result = searchResults.hits.map((res) => (res.highlights[0] || {}).snippet || res.document.id)
  return reply.send(result)
})


// API 서버 실행
fastify.listen(3000, (err, address) => {
  if (err) throw err
  fastify.log.info(`server listening on ${address}`)
})

* 기본적인 소스는 https://fureweb-com.github.io/ 에서 참고하였습니다.  

 

실행 결과 화면

 

위 화면 같이 나오면 잘 됩니다.

반응형