Postgresql préfixe générique pour le texte complet
Je suis en train de lancer un fulltext requête à l'aide de Postgresql qui peuvent répondre pour les correspondances partielles à l'aide de caractères génériques.
Il semble assez facile d'avoir un suffixe générique après le terme de recherche, cependant je ne peux pas comprendre comment spécifier un préfixe générique.
Par exemple, je peux faire un suffixe de recherche assez facilement en utilisant quelque chose comme..
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*') )
doit retourner des résultats qui correspondent à "Londres"
Cependant je ne peux pas semblent faire une recherche par préfixe comme...
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don') )
Idéalement, j'aimerais avoir un caractère générique préfixé à l'avant et à la fin du terme de recherche, quelque chose comme...
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*') )
Je peux utiliser une condition cependant, j'ai été en espérant profiter de la performance de l'intégralité des fonctionnalités de recherche dans Postgres.
Vous devez vous connecter pour publier un commentaire.
De la recherche plein texte est bon pour la recherche de mots, pas de sous-chaînes.
Pour la sous-chaîne de recherches, vous feriez mieux d'utiliser
like '%don%'
avecpg_trgm
extension disponible à partir de PostgreSQL 9.1 etusing gin (column_name gin_trgm_ops)
ouusing gist (column_name gist_trgm_ops)
index. Mais votre index serait très grandes (même plusieurs fois plus grand que votre table) et les performances d'écriture n'est pas très bonne.Il y a un très bon exemple d'utilisation de pg_trgm pour la sous-chaîne de recherche sur sélectionnez * à partir de depesz blog.
Un sauvage et fou moyen de le faire serait de créer un tsvector index de tous vos documents, renversée. Et à l'inverse de vos requêtes pour postfix recherche trop.
C'est essentiellement ce que Solr fait avec ses ReversedWildcardFilterFactory
row
au lieu derown
il ne sera pas de retour des résultats. La raison en est qu'il va vérifier à partir de la fin, mais encore une fois seulement à partir de la première (dernière dans cette situation) lettre, et jamais, depuis le moyen.row
et matchbrown
alors c'est un bon cas d'utilisation pour les regexp