web-dev-qa-db-fra.com

Recherche de méthode simple contient lors de la recherche de texte dans postgresql

Je suis nouveau dans le monde PostgreSQL, je m'excuse donc à l'avance de ne pas savoir s'il existe une réponse évidente à ces questions.

Fondamentalement, je recherche deux choses. D'abord, une simple recherche basée sur "contient" où l'équivalent python serait quelque chose comme:

def find_all_containing( input_array=[], target ):
    output=[]
    for i in input_array:
        if target in i:
            output.append(i)
    return(output) 

Dans la base de données que je suis en train de construire, logiquement, j'ai tendance à croire que la commande SQL ressemblerait un peu à ceci si j'essayais de montrer tous les titres d'extraits qui contenaient `` evil '' dans la description.

SELECT title FROM snippets WHERE 'evil' in description;
/* or */
SELECT title FROM snippets WHERE description CONTAINS 'evil';

J'ai écrit une fonction en ligne python qui retourne un 'TRUE' ou 'FALSE' pour faire le travail suivant.

/* contains function here */
CREATE FUNCTION contains (input_text text, target text) RETURNS text AS $$
if target in input_text:
  return("TRUE")
return("FALSE")
$$ LANGUAGE plpythonu;

/* working command of the script */
SELECT title FROM snippets WHERE contains(description,'Evil')='TRUE';

Cela fonctionne et devrait m'empêcher de demander, mais je préférerais vraiment apprendre comment le monde SQL résoudrait cela parce que le but de l'apprentissage de SQL était d'apprendre à travailler la base de données au lieu de simplement trouver une autre façon de modeler python pour recréer une sensation nosql.

La deuxième chose est que ce n'est pas la première fois que je rassemble quelques-uns python extrait pour apporter plus d'une mentalité pythonique à la base de données. Pour ceux qui sont bien plongés dans le monde SQL est-ce que je manque quelque chose en faisant cela? Je l'obtiens pour la vitesse, mais si la vitesse est un problème, je suppose que j'ai juste besoin de réécrire l'implémentation en C.

Rester aussi simple que possible a très bien fonctionné jusqu'à présent et cela fonctionne comme cela pour l'instant. Mais, lorsque je me retrouve à intégrer une autre langue dans le code pour presque toutes les solutions, c'est quand je commence à demander si je manque une image plus grande.

5
codykochmann

Il existe deux façons typiques d'exprimer cela.

Avec LIKE recherche infixe:

SELECT title FROM snippets WHERE description LIKE '%evil%';

ou avec position:

SELECT title FROM snippets WHERE position('evil' in description) > 0;

Notez qu'aucun des deux n'est indexable par défaut. Recherchez "index de recherche infixe" pour plus d'informations à ce sujet et examinez pg_trgm si tu en as besoin.

9
Craig Ringer