PostgreSQL accent + recherche insensible à la casse

je suis à la recherche d'un moyen de soutenir avec de bonnes performances cas insensible + accent insensible recherche. Jusqu'à présent, nous n'avions aucun problème avec le serveur MSSql , sur Oracle nous devions utiliser OracleText , et maintenant nous en avons besoin sur PostgreSQL.

j'ai trouvé ce post sur l'accent insensible:

est-ce que PostgreSQL supporte les collations" insensibles à l'accent"?

mais nous devons le combiner avec case insensitve. Nous devons également utiliser des indices, sinon les performances pourraient être affectées. Expérience sur la meilleure approche pour les grandes bases de données?

3
demandé sur Community 2015-02-20 14:31:29

2 réponses

si vous avez besoin de" combiner avec insensible à la casse", Il ya un certain nombre d'options, en fonction de vos besoins exacts.

peut-être plus simple, rendre l'indice d'expression cas insensible.

S'appuyant sur la fonction f_unaccent() exposée dans la réponse référencée:

CREATE INDEX users_lower_unaccent_name_idx ON users(lower(f_unaccent(name)));

puis:

SELECT *
FROM   users
WHERE  lower(f_unaccent(name)) = lower(f_unaccent('João'));

Ou , vous pouvez construire la lower() dans la fonction f_unaccent() , pour en tirer quelque chose comme f_lower_unaccent() .

ou (surtout si vous avez besoin de faire un motif flou correspondant de toute façon), vous pouvez utiliser un indice de trigramme fourni par le module supplémentaire pg_trgm en s'appuyant sur la fonction ci-dessus, qui soutient également ILIKE . Details:

j'ai ajouté une note à la réponse référencée .

Ou , vous pouvez utiliser le module supplémentaire citext :

5
répondu Erwin Brandstetter 2017-05-23 11:55:03

Plein-Texte-Recherche Dictionnaire Unaccent insensibles à la casse

FTS est naturellement sensible à la casse par défaut,

convertissant des jetons en lexèmes. Un lexème est une chaîne, tout comme un jeton, mais il a été normalisé de sorte que différentes formes du même mot sont faites semblables. Par exemple, la normalisation inclut presque toujours le pliage des lettres majuscules en lettres minuscules , et implique souvent la suppression de suffixes (tels que s ou es en anglais).

et vous pouvez définir votre propre dictionnaire en utilisant unaccent ,

CREATE EXTENSION unaccent;

CREATE TEXT SEARCH CONFIGURATION mydict ( COPY = simple );
ALTER TEXT SEARCH CONFIGURATION mydict
  ALTER MAPPING FOR hword, hword_part, word
  WITH unaccent, simple;

que vous pouvez ensuite indexer avec un index fonctionnel,

-- Just some sample data...
CREATE TABLE myTable ( myCol )
  AS VALUES ('fóó bar baz'),('qux quz');

-- No index required, but feel free to create one
CREATE INDEX ON myTable
  USING GIST (to_tsvector('mydict', myCol));

vous pouvez maintenant l'interroger très simplement

SELECT *
FROM myTable
WHERE to_tsvector('mydict', myCol) @@ 'foo & bar'

    mycol    
-------------
 fóó bar baz
(1 row)

voir aussi

0
répondu Evan Carroll 2018-05-30 02:00:58