PostgreSQL: Recherche en Texte Intégral - Comment rechercher des mots partiels?
À la suite d'une question posté ici sur comment je peux augmenter la vitesse sur l'un de mes SQL méthodes de Recherche, on m'a conseillé de mettre à jour ma table pour faire usage de la Recherche Plein Texte. C'est ce que j'ai fait, en utilisant les index Gist pour rendre la recherche plus rapide. Sur une partie de la "plaine" de requêtes, j'ai remarqué une augmentation marquée, qui j'en suis très heureux.
Cependant, j'ai de la difficulté dans la recherche pour des mots partiels. Par exemple, j'ai plusieurs dossiers qui contiennent le mot Squire (454) et j'ai plusieurs dossiers qui contiennent de l'Écureuil (173). Maintenant, si je recherche pour Squire elle renvoie uniquement l'454 dossiers, mais je le veux de retour de l'Écureuil registres.
Ma requête ressemble à ceci
SELECT title
FROM movies
WHERE vectors @@ to_tsoquery('squire');
J'ai pensé que je pouvais faire to_tsquery('squire%')
mais qui ne fonctionne pas.
Comment puis-je obtenir qu'elle recherche les correspondances partielles ?
Aussi, dans ma base de données j'ai des enregistrements de films et d'autres qui sont des émissions de TÉLÉVISION. Elles sont différenciées par la "" sur le nom, donc, comme "Munsters" est une émission de TÉLÉVISION, alors que Les Munsters est le film de l'exposition. Ce que je veux être en mesure de faire est de rechercher pour juste l'émission de TÉLÉVISION ET simplement les films. Une idée sur comment je peux faire ?
Ce qui concerne
Anthoni
squire
mais souhaitez obtenir le résultat squirrel
, vous pourriez avoir à spécifier des contraintes supplémentaires. Parce que sinon, on pourrait faire valoir qu'ils avaient la clé de recherche mama
mais je voulais le résultat rabbit
. Alors peut-être que vous pourriez voulez diviser votre recherche de la clé et tournez - squire
en s | sq | squ | squi | squir | squire
... Ce ou amateur algorithmes de vous obtenir le squirrel
. Je pense que @Joshua Brûlures de la réponse contient plus de solution générique que le mien, si vous voulez être générique.OriginalL'auteur Anthoni Gardner | 2010-03-25
Vous devez vous connecter pour publier un commentaire.
Même à l'aide de
LIKE
vous ne serez pas en mesure d'obtenir des "écureuil" desquire%
parce que 'écureuil' a deux 'r. Pour obtenir de l'Écuyer et l'Écureuil vous pouvez exécuter la requête suivante:De différencier entre les films et émissions de télévision, vous devez ajouter une colonne à votre base de données. Cependant, il existe de nombreuses façons de la peau, ce chat. Vous pouvez utiliser une sous-requête pour forcer postgres d'abord de trouver les films correspondant à "squire" et "écureuil" et ensuite, la recherche qui sous-ensemble pour trouver des titres qui commencent par un '"'. Il est possible de créer des index pour une utilisation dans
LIKE '"%...'
recherches.Sans explorer d'autres possibilités d'indexation, vous pouvez également exécuter ces déconner avec eux pour trouver celui qui est le plus rapide:
ou
OriginalL'auteur
Essayer,
Cela fonctionne sur PostgreSQL 8.4+
Je suis en désaccord parce que cette méthode fonctionne. L'OP est d'essayer d'obtenir 2 mots qui ne sont pas similaires.
squire
est pas partielle de la parolesquirrel
. Il a demandé une correspondance partielle et cette réponse n'est que. Il devrait être upvoted.Merci pour cette, aidé dans un cas d'utilisation que j'ai. +1
Merci cela a résolu mon problème de correspondance partielle. Où puis-je trouver de la documentation qui vous a amené à ajouter :*
En dépit de cette réponse étant de 8 ans, j'ai tout de même envie de savoir: Que faire si je veux rechercher des
quir
? I. e., ayant un caractère générique à la fois et de fin et de début de la recherche.OriginalL'auteur
Anthoni,
En supposant que vous prévoyez d'utiliser uniquement le codage ASCII (pourrait être difficile, je suis au courant), une option très viable peut être le Trigramme (pg_trgm) module: http://www.postgresql.org/docs/9.0/interactive/pgtrgm.html
Trigramme utilise intégré dans les méthodes d'indexation tels que les Gist et Gin. La seule modification que vous avez à faire est lors de la définition de votre index, spécifier une Classe d'Opérateur de
gist_trgm_ops
ougin_trgm_ops
.Si la contrib modules ne sont pas déjà installés, dans Ubuntu, c'est facile et en exécutant la commande suivante à partir de la coque:
Après la contrib modules sont mis à disposition, vous devez installer le pg_trgm extension dans la base de données en question. Vous faites cela en exécutant la commande suivante PostgreSQL requête sur la base de données que vous souhaitez installer le module dans:
Après la pg_trgm extension a été installée, nous sommes prêts à vous amuser!
la similitude dans votre exemple utilise le mot et pas le mal orthographié le mot qui est utilisé dans votre clause where. sélectionnez la similitude('Frist Entrée', 'Première Entrée') => 0.5
bon point, faute de frappe sur ma fin. résolu. merci pour le heads up 🙂
OriginalL'auteur
@alexandre-mera solution fonctionne très bien!
Note: assurez-vous Également de convertir les espaces en
+
. Par exemple, si vous êtes à la recherche poursquire knight
.OriginalL'auteur
Le large solution pour cela est d'utiliser PG est ts_rewrite fonction pour configurer un alias de table qui fonctionne pour les autres matchs (voir La Réécriture De La Requête). Cela couvre des cas comme le vôtre ci-dessus prise en charge complètement différents cas, comme à la recherche d'
tree rat
et à obtenir des résultats poursquirrel
, etc.Plein de détails et d'explications à ce lien, mais l'essentiel, c'est que vous pouvez configurer un alias de table avec 2 ts_query colonnes et de transmettre une requête de cette table dans votre recherche, comme suit:
Résultant en une dernière requête qui ressemble plus à:
Ceci est similaire à la de dictionnaire des synonymes de l'installation au sein de PG, mais fonctionne sans nécessiter toute une réindexer chaque fois que vous ajoutez quelque chose. Que vous rencontrez peu de variations orthographiques et les cas de "quand je recherche pour cela, j'attends des résultats du type" il est très facile de simplement les ajouter à la table de réel rapide. Vous pouvez ajouter d'autres colonnes de la table ainsi tant que la requête en fonction de
ts_rewrite
retourne le 2 est attenduto_tsquery
colonnes.Lorsque vous creusez dans cette documentation, vous verrez que des exemples pour l'optimisation des performances ainsi. Il y a un équilibre entre l'utilisation des trigramme pour la vitesse à l'état pur et à l'aide de vecteur/de requête/réécriture pour la robustesse.
OriginalL'auteur
Une chose qui peut travailler est de briser le mot que vous recherchez dans les plus petites pièces. Donc, vous pourriez regarder pour des choses qui ont squi ou quir ou squire ou etc... je ne suis pas sûr de savoir comment efficace qui serait être bien, mais il peut l'aider.
Lors de votre recherche pour le film ou le film que vous pouvez essayer de placer le texte dans le devis. donc, il serait soit "afficher" ou " "show"'. Je pense que ça pourrait aussi fonctionner.
OriginalL'auteur