SQL Connect로 전체 텍스트 검색 실행

Firebase SQL Connect는 PostgreSQL을 기반으로 하는 전체 텍스트 검색을 지원합니다. 전체 텍스트 검색을 사용하면 여러 열에서 동시에 키워드와 구문을 검색하여 대규모 데이터 세트 내에서 정보를 빠르고 효율적으로 찾을 수 있습니다.

서비스에 전체 텍스트 검색을 추가할 수 있습니다. 먼저 검색하려는 스키마의 String@searchable 지시어를 추가합니다. 예를 들면 다음과 같습니다.

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

이 지시어를 추가한 후에는 쿼리에 <pluralType>_search 필드를 추가하여 전체 텍스트 검색을 실행할 수 있습니다. 이 경우 movies_search가 됩니다.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

전체 텍스트 검색 결과 미세 조정

@searchable 지시어 및 _search 필드에 인수를 추가하여 전체 텍스트 검색 결과를 미세 조정할 수 있습니다.

공유 인수

기본 목록 필드 <pluralType>에 사용되는 인수와 동일한 인수를 사용하여 검색 결과를 제어할 수 있습니다.

  • order를 사용하면 결과의 순서를 변경할 수 있습니다. 생략하면 결과가 관련성 내림차순으로 정렬됩니다.
  • where를 사용하면 검색에 추가 필터를 추가할 수 있습니다 (예: 특정 장르의 영화만 검색 ).
  • limit를 사용하면 쿼리가 상위 X개의 결과만 반환합니다.
  • offset을 사용하면 쿼리가 처음 X개의 결과를 건너뜁니다.
  • distinct는 생성된 SQL에 DISTINCT 연산자를 추가합니다.

언어 선택

기본적으로 전체 텍스트 검색은 영어로 문서를 파싱합니다. @searchable 지시어의 언어 인수를 사용하여 이를 변경할 수 있습니다.

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

올바른 언어를 지정하면 PostgreSQL이 정확한 어휘 어간 추출을 실행하고 검색에서 관련 결과를 놓치지 않도록 할 수 있습니다. 여러 열을 검색하는 경우 모든 열이 동일한 언어로 설정되어야 합니다.

언어
  • 단순해야 합니다.
  • 아랍어
  • 아르메니아/아르메니아인
  • 바스크/바스크인
  • 카탈로니아/카탈로니아인
  • 덴마크/덴마크인
  • 네덜란드/네덜란드인
  • 영어
  • 에스토니아/에스토니아인
  • 핀란드/핀란드인
  • 프랑스/프랑스인
  • 독일/독일인
  • 그리스/그리스인
  • 힌디어
  • 헝가리/헝가리인
  • 인도네시아/인도네시아인
  • 아일랜드/아일랜드인
  • 이탈리아/이탈리아인
  • 리투아니아/리투아니아인
  • 네팔/네팔인
  • 노르웨이/노르웨이인
  • 포르투갈/포르투갈인
  • 루마니아/루마니아인
  • 러시아/러시아인
  • 세르비아/세르비아인
  • 스페인어
  • 스웨덴/스웨덴인
  • 타밀/타밀인
  • 터키/터키인
  • 이디시어

PostgreSQL 전체 텍스트 검색에서 지원하는 모든 언어를 지원합니다. psql을 사용하면 다음 쿼리로 전체 목록을 가져올 수 있습니다.

SELECT cfgname FROM pg_ts_config;

쿼리 형식

기본적으로 전체 텍스트 검색은 쿼리에 웹 시맨틱스를 사용합니다 (Google 검색과 유사). <pluralType>_search 필드의 queryFormat 인수를 사용하여 이 동작을 변경할 수 있습니다.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

쿼리 형식에는 다음 네 가지 옵션이 있습니다.

  • QUERY 는 웹 검색 엔진에 익숙한 시맨틱스를 제공합니다 (예: 따옴표로 묶인 문자열, AND, OR). 기본값입니다.
  • PLAIN 은 모든 단어와 일치하지만 반드시 함께 일치하지는 않습니다('갈색 개'는 '갈색과 흰색 개' 또는 '흰색과 갈색 개'와 일치함).
  • PHRASE 는 정확한 구문과 일치합니다('갈색 개'는 '흰색과 갈색 개'와 일치하지만 '갈색과 흰색 개'와는 일치하지 않음).
  • ADVANCED를 사용하면 전체 tsquery 연산자 집합을 사용하여 복잡한 쿼리를 만들 수 있습니다.

관련성 기준점

관련성 기준점을 설정하면 검색에서 특정 관련성 값보다 높은 결과만 반환합니다. 대부분의 경우 이를 설정할 필요가 없습니다. 관련성이 0보다 큰 결과는 관련 결과입니다.

그러나 검색에서 관련성이 없는 결과가 반환되는 경우 관련성 기준점을 사용하여 결과를 필터링할 수 있습니다.

관련성 기준점에 적절한 값을 파악하려면 몇 가지 테스트 검색을 실행하고 _metadata.relevance를 확인해야 합니다.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

관련성이 없다고 생각되는 결과를 생략하는 기준점을 선택합니다. 방법은 다음과 같습니다.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

전체 텍스트 검색, 벡터 유사성 검색, 문자열 패턴 필터 중에서 선택

SQL Connect는 데이터베이스를 검색하는 몇 가지 방법을 제공합니다.

이 표를 사용하여 사용 사례에 적합한 방법을 선택하세요.

전체 텍스트 검색 벡터 유사성 검색 문자열 패턴 필터
일반 검색 기능을 구현하는 데 적합 의미적으로 유사한 행을 찾는 데 적합 (예: 추천 또는 '이와 유사한 항목') 정확한 텍스트 일치 또는 정규 표현식 검색에 적합
동일한 단어의 다양한 형태 또는 시제를 일치시키는 데 도움이 되는 어휘 어간 추출을 실행함 Vertex AI 필요 색인 또는 생성된 열이 필요하지 않으므로 메모리 및 디스크 공간을 가장 적게 사용함
테이블의 여러 열에서 실행할 수 있음 한 번에 하나의 열에서만 작동함 OR 필터를 사용하여 테이블의 여러 열에서 실행할 수 있음
대규모 문서에서 성능이 우수함 대규모 문서에서 성능이 우수함 대규모 문서를 검색할 때 성능이 떨어짐
생성된 열과 각 검색의 색인을 저장하기 위해 메모리 및 저장소 오버헤드를 추가함