PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengindeks tabel postgres dengan nama, ketika namanya bisa dalam bahasa apa pun?

Jika Anda ingin mengoptimalkan kecocokan substring arbitrer, salah satu opsi adalah menggunakan pg_tgrm modul . Tambahkan indeks:

CREATE INDEX table_location_name_trigrams_key ON table
  USING gin (location_name gin_trgm_ops);

Ini akan memecah "Simple Cafe" menjadi "sim", "imp", "mpl", dll., dan menambahkan entri ke indeks untuk setiap trigam di setiap baris. Perencana kueri kemudian dapat secara otomatis menggunakan indeks ini untuk pencocokan pola substring, termasuk:

SELECT * FROM table WHERE location_name ILIKE '%cafe%';

Kueri ini akan mencari "caf" dan "afe" di indeks, menemukan persimpangan, mengambil baris tersebut, lalu memeriksa setiap baris dengan pola Anda. (Pemeriksaan terakhir itu diperlukan karena persimpangan "caf" dan "afe" cocok dengan "simple cafe" dan "unsafe scaffolding", sedangkan "%cafe%" hanya cocok dengan satu). Indeks menjadi lebih efektif karena pola input menjadi lebih panjang karena dapat mengecualikan lebih banyak baris, tetapi masih tidak seefisien pengindeksan seluruh kata, jadi jangan berharap peningkatan kinerja di atas to_tsvector .

Menariknya, trigram tidak berfungsi sama sekali untuk pola yang di bawah tiga karakter. Itu mungkin atau mungkin bukan pemecah kesepakatan untuk aplikasi Anda.

Sunting: Saya awalnya menambahkan ini sebagai komentar.

Aku punya pikiran lain tadi malam ketika aku kebanyakan tidur. Buat cjk_chars fungsi yang mengambil string input, regexp_matches seluruh rentang CJK Unicode, dan mengembalikan larik karakter tersebut atau NULL jika tidak ada. Tambahkan indeks GIN di cjk_chars(location_name) . Kemudian kueri untuk:

WHERE CASE
  WHEN cjk_chars('query') IS NOT NULL THEN
    cjk_chars(location_name) @> cjk_chars('query')
    AND location_name LIKE '%query%'
  ELSE
    <tsvector/trigrams>
  END

Ta-da, unigram!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara tercepat untuk menerapkan 150 juta pembaruan pada tabel PostgreSQL

  2. “PERINGATAN:Ditemukan ketidakcocokan antara sl_table dan pg_class.” di Slony-I

  3. Tambahkan susunan case-insensitive ke PostgreSQL

  4. Dalam lingkungan multi-server, jika situs tidak aktif selama lebih dari 15 menit, server kehilangan koneksi ke database PostgreSQL

  5. postgresql malformed array literal dalam membuat initcond agregat