sql >> Databáze >  >> RDS >> PostgreSQL

Podobné řetězce UTF-8 pro pole automatického doplňování

Nepoužíváte třídu operátorů poskytovanou pg_trgm modul. Vytvořil bych index takto:

CREATE INDEX label_Lower_unaccent_trgm_idx
ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);

Původně jsem zde měl index GIN, ale později jsem se dozvěděl, že GiST je pro tento druh dotazu pravděpodobně ještě vhodnější, protože dokáže vrátit hodnoty seřazené podle podobnosti. Další podrobnosti:

  • Postgresql:Shoda vzorů mezi dvěma sloupci
  • Rychlé nalezení podobných řetězců pomocí PostgreSQL

Váš dotaz musí odpovídat indexovému výrazu, abyste jej mohli použít.

SELECT label
FROM   the_table
WHERE  lower(unaccent_text(label)) % 'fil'
ORDER  BY similarity(label, 'fil') DESC -- it's ok to use original string here

Nicméně „filbert“ a „filé powder“ nejsou ve skutečnosti příliš podobné „fil“ podle operátora %. Mám podezření, že to, co opravdu chcete, je toto:

SELECT label
FROM   the_table
WHERE  lower(unaccent_text(label)) ~~ '%fil%'
ORDER  BY similarity(label, 'fil') DESC -- it's ok to use original string here

To najde všechny řetězce obsahující hledaný řetězec a seřadí nejlepší shody podle % nejprve operátor.

A ta šťavnatá část:výraz může používat index GIN nebo GiST od PostgreSQL 9.1 ! Cituji manuál k myši pg_trgm:

Počínaje PostgreSQL 9.1 tyto typy indexů také podporují například indexsearch pro LIKE a ILIKE

Pokud jste skutečně chtěli použít % operátor:

Zkusili jste snížit prahovou hodnotu pro operátor podobnosti % pomocí set_limit() :

SELECT set_limit(0.1);

nebo ještě nižší? Výchozí hodnota je 0,3. Jen abychom viděli, zda je to práh, který filtruje další shody.



  1. Vygenerujte sql s poddotazem jako sloupec v příkazu select pomocí SQLAlchemy

  2. Jak deklarovat proměnnou v dotazu PostgreSQL

  3. Převeďte časové razítko na datum v Oracle SQL

  4. Získejte poslední vložené ID řádku (s příkazem SQL)