Melakukan penelusuran teks lengkap dengan Data Connect

Firebase Data Connect mendukung penelusuran teks lengkap, yang didukung oleh PostgreSQL. Penelusuran teks lengkap memungkinkan Anda menemukan informasi dengan cepat dan efisien dalam set data besar dengan menelusuri kata kunci dan frasa di beberapa kolom sekaligus.

Anda dapat menambahkan penelusuran teks lengkap ke layanan Anda. Pertama, tambahkan direktif @searchable ke String dalam skema yang ingin Anda telusuri. Misalnya:

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
}

Setelah menambahkan direktif ini, Anda dapat melakukan penelusuran teks lengkap dengan menambahkan kolom <pluralType>_search ke kueri. Dalam hal ini, nilainya adalah movies_search:

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

Menyesuaikan hasil penelusuran teks lengkap

Anda dapat menyempurnakan hasil penelusuran teks lengkap dengan menambahkan argumen ke direktif @searchable dan kolom _search;

Argumen bersama

Anda dapat mengontrol hasil penelusuran dengan banyak argumen yang sama yang digunakan untuk kolom daftar dasar <pluralType>:

  • order memungkinkan Anda mengubah urutan hasil. Jika tidak ada, hasil akan diurutkan berdasarkan relevansi menurun.
  • where memungkinkan Anda menambahkan filter tambahan untuk penelusuran (misalnya, menelusuri hanya film bergenre tertentu).
  • limit membuat kueri hanya menampilkan X hasil teratas.
  • offset membuat kueri melewati X hasil pertama.
  • distinct menambahkan operator DISTINCT ke SQL yang dihasilkan.

Pilihan bahasa

Secara default, penelusuran teks lengkap mengurai dokumen dalam bahasa Inggris. Anda dapat mengubahnya dengan argumen bahasa pada direktif @searchable:

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

Menentukan bahasa yang tepat akan memungkinkan PostgreSQL melakukan stemming leksikal yang akurat dan membantu memastikan bahwa penelusuran Anda tidak melewatkan hasil yang relevan. Jika Anda menelusuri beberapa kolom, semuanya harus ditetapkan ke bahasa yang sama.

Languages
  • sederhana
  • arabic
  • armenia
  • basque
  • katalan
  • denmark
  • belanda
  • English
  • finlandia
  • Prancis
  • jerman
  • greek
  • hindi
  • hungaria
  • Indonesia
  • irlandia
  • italia
  • lituania
  • nepali
  • norwegia

Dengan menggunakan psql, Anda bisa mendapatkan daftar lengkap dengan kueri berikut.

SELECT cfgname FROM pg_ts_config;

Format kueri

Secara default, penelusuran teks lengkap menggunakan semantik web untuk kueri (mirip dengan penelusuran Google). Anda dapat mengubah perilaku ini dengan argumen queryFormat di kolom <pluralType>_search.

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

Ada empat opsi untuk format kueri:

  • QUERY memberikan semantik yang sudah dikenal ke mesin telusur web (misalnya, string yang dikutip, AND, dan OR). Ini adalah defaultnya.
  • POLOS cocok dengan semua kata, tetapi tidak harus bersama-sama ("anjing cokelat" akan cocok dengan "anjing cokelat dan putih" atau "anjing putih dan cokelat").
  • PHRASE mencocokkan frasa yang tepat ( "brown dog" akan cocok dengan "the white and brown dog", tetapi tidak akan cocok dengan "brown and white dog").
  • LANJUTAN memungkinkan Anda membuat kueri kompleks menggunakan set lengkap operator tsquery.

Nilai minimum relevansi

Menetapkan nilai minimum relevansi berarti penelusuran Anda hanya akan menampilkan hasil yang memiliki nilai relevansi di atas nilai tertentu. Dalam banyak kasus, Anda tidak perlu menyetelnya - hasil apa pun yang memiliki relevansi lebih besar dari 0 akan menjadi hasil yang relevan.

Namun, jika Anda mendapati bahwa penelusuran Anda menampilkan hasil yang terasa tidak relevan, Anda dapat memfilter hasil tersebut menggunakan nilai minimum relevansi.

Untuk mengetahui nilai yang sesuai untuk nilai minimum relevansi, Anda harus melakukan beberapa penelusuran pengujian dan melihat _metadata.relevance:

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

Pilih nilai minimum yang akan menghilangkan hasil yang menurut Anda tidak relevan. Untuk melakukannya:

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

Memilih antara penelusuran teks lengkap, penelusuran kemiripan vektor, dan filter pola string

Data Connect menawarkan beberapa cara untuk menelusuri database Anda.

Gunakan tabel ini untuk membantu Anda memilih yang tepat untuk kasus penggunaan Anda.

Penelusuran teks lengkap Penelusuran kemiripan vektor Filter pola string
Cocok untuk menerapkan fungsi penelusuran umum Baik untuk menemukan baris yang mirip secara semantik (misalnya, rekomendasi atau 'Lebih seperti ini') Cocok untuk pencocokan teks persis atau penelusuran ekspresi reguler
Melakukan stemming leksikal, yang membantu mencocokkan berbagai bentuk atau kala dari kata yang sama Memerlukan Vertex AI Menggunakan ruang disk dan memori paling sedikit, karena tidak memerlukan indeks atau kolom yang dihasilkan
Dapat dilakukan di beberapa kolom dalam tabel Hanya berfungsi untuk satu kolom dalam satu waktu Dapat dilakukan di beberapa kolom dalam tabel menggunakan filter OR
Performa yang baik pada dokumen yang lebih besar Performa yang baik pada dokumen besar Performa kurang baik saat menelusuri dokumen yang lebih besar
Menambahkan overhead memori dan penyimpanan untuk menyimpan kolom yang dihasilkan dan indeks untuk setiap penelusuran