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

Firebase Data 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 지시문의 language 인수를 사용하여 이를 변경할 수 있습니다.

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

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

언어
  • 단순해야 합니다.
  • 아랍어
  • 아르메니아/아르메니아인
  • 바스크/바스크인
  • 카탈로니아/카탈로니아인
  • 덴마크/덴마크인
  • 네덜란드/네덜란드인
  • english
  • 핀란드/핀란드인
  • 프랑스/프랑스인
  • 독일/독일인
  • 그리스/그리스인
  • 힌디어
  • 헝가리/헝가리인
  • 인도네시아/인도네시아인
  • 아일랜드/아일랜드인
  • 이탈리아/이탈리아인
  • 리투아니아/리투아니아인
  • 네팔/네팔인
  • 노르웨이/노르웨이인

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는 정확한 구문과 일치합니다 ( '갈색 개'는 '흰색과 갈색 개'와 일치하지만 '갈색과 흰색 개'와는 일치하지 않음).
  • 고급을 사용하면 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
    ...
  }
}

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

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

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

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