Si j'ai des chaînes / expressions telles que celles-ci stockées dans la base de données: p>
- Quelles sont les opérations de type Q? Li>
- Guide du programmeur Li>
- a.b.ca de codage li> ul> blockQuote>
Y a-t-il un moyen de transmettre un paramètre de requête dans
"Programmeurs" code "ou" ABC " code> ou" Type Q / code> et ont Il trouve"'s" "'s" code>,"ABC" code> et"type q type" code>? p>
6 Réponses :
Vous pouvez essayer avec un ilike avec une fonction de traduction, voir ici < / a>. p>
Par exemple: Traduire (champ, '.- \' '', '' ') code> p>
AW, cela aurait été une solution parfaite à court terme pour rechercher des chaînes simples, sauf que je ne peux pas obtenir cette apostrophe pour s'échapper dans des rails! Article.Find (: Conditions => ["Traduire (Articles.title, '.- \' '' ',' '' ') Ilike?", Query]) Code> Jetons ... ... code> (essayé plusieurs méthodes d'échappement). Pourrait aller avec Tsvector, plus probable en solr. Merci!
Oups, peut-être d'échapper à une apostrophe que vous devez doubler: '' code>
Il peut être utile d'utiliser la syntaxe de devis unique généralisée que Ruby fournit: article.find (: conditions => [% q {Traduire (Articles.title, '.- \' '' ',' ') Ilike?}, requête]) code>. Sinon Ruby attrapera le \ que vous essayez de transmettre à SQL et que vous devriez utiliser 2 ou 3 '. Ruby ne s'échappe pas dans des cordes cotées simples, la façon dont il fait avec des cordes cotées. IE met ('1 \ n2'); met ("3 \ n4") # => 1 \ n2 * newline * 3 * newline * 4 * newline * code>
Cela ressemble à vous voulez quelque chose qui le long de ces lignes:
http: / /www.postgresql.org/docs/9.0/static/fuzzystrmatch.html p>
Je ne suis pas sûr à 100% si cela couvrira ce que vous voulez. P>
edit strud> Je devais exécuter cela localement pour vérifier (en utilisant PostgreSQL 9.0 sous Windows) P> Voici ce que j'ai trouvé: p> template1=> select soundex('Programmers'), soundex('Programmer''s');
soundex | soundex
---------+---------
P626 | P626
(1 row)
template1=> select soundex('abc'), soundex('A.B.C.');
soundex | soundex
---------+---------
A120 | A120
(1 row)
template1=> select soundex('Q-type'), soundex('q-type');
soundex | soundex
---------+---------
Q310 | Q310
(1 row)
Voici un autre lien qui peut être pertinent. Detissez la valeur du champ à partir de toute la ponctuation avant de la comparer à la chaîne de recherche. P>
SQL Server: Comment supprimez-vous la ponctuation de Un champ? p>
postgres prend en charge la correspondance des motifs afin que vous puissiez créer une expression régulière dans votre clause où http://www.postgresql.org/docs/8.3/static/functions -Matching.html p>
Utilisez le type code> TSVector code>, qui fait partie de la fonction de recherche texte postgreSQL. p> Vous pouvez utiliser des opérateurs familiers Sur les tsvectors aussi: p> Une valeur TSVector est une liste triée de lexemes distincts, qui sont des mots normalisés pour fusionner différentes variantes du même mot (voir chapitre 12 pour plus de détails). Le tri et la duplication-élimination sont effectués automatiquement pendant l'entrée p>
blockQuote> Si vous souhaitez également faire une normalisation spécifique à la langue, comme supprimant les mots communs («le ',' A ', etc.) et multiplie, utilisez la fonction fais évidemment cela pour chaque rangée d'une requête sera chère - Vous devez donc stocker le TSVector dans une colonne séparée et utiliser TS_Query () pour la recherche. Cela vous permet également de créer un indice de gist sur le TSVector. P>
to_tsvector code>. Il attribue également des poids à différents mots pour la recherche de texte: p> la recherche de texte plein soufflé h2>
postgres> select phrase from text where tsvec @@ to_tsquery('q-type');
phrase
-----------------------------
What are Q-type Operations?
(1 row)
postgreSQL prend en charge la recherche de texte intégral en convertissant une entrée de texte en Comme vous pouvez le constater, la tige utilisée par défaut fera "la programmation" "programmeur" et "de programmeur" tous correspondent de manière identique. p> Vous l'utiliseriez généralement en ayant une colonne ou une expression de Tsvector indexée, puis utilisez l'opérateur ici TSVector code> Types: @@ code>. a tsquery code>, par exemple: p> plainto_tsquerie code> analyse une chaîne d'entrée utilisateur et produit une requête où chaque non- Arrêter le mot dans la requête doit être jumelé par un TSVector. P> p>