it-swarm.com.de

Suchen nach einfachen enthält Methode beim Suchen von Text in postgresql

Ich bin neu in der PostgreSQL-Welt, daher entschuldige ich mich im Voraus dafür, dass ich nicht weiß, ob es eine offensichtliche Antwort auf diese Fragen gibt.

Grundsätzlich suche ich zwei Dinge. Zuerst eine einfache "enthält" -basierte Suche, bei der das Äquivalent python) ungefähr so ​​lautet:

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

In der Datenbank, die ich gerade erstelle, neige ich logischerweise dazu zu glauben, dass der SQL-Befehl ein bisschen so aussehen würde, wenn ich versuchen würde, alle Snippet-Titel anzuzeigen, die in der Beschreibung "böse" enthalten.

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

Ich habe eine Inline-Funktion python) geschrieben, die 'TRUE' oder 'FALSE' zurückgibt, damit das Folgende funktioniert.

/* 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';

Dies funktioniert und sollte mich davon abhalten zu fragen, aber ich würde es wirklich vorziehen zu lernen, wie die SQL-Welt dies lösen würde, da der springende Punkt beim Erlernen von SQL darin bestand, zu lernen, wie die Datenbank funktioniert, anstatt nur einen anderen Weg zu finden, um zu formen python, um ein nosql-Feeling wiederherzustellen.

Die zweite Sache ist, dass dies nicht das erste Mal ist, dass ich ein python - Snippet) zusammengewürfelt habe, um mehr von einer pythonischen Mentalität in die Datenbank zu bringen. Für diejenigen, die gut in die SQL-Welt eingegraben sind Verpasse ich dadurch etwas? Ich bekomme es aus Gründen der Geschwindigkeit, aber wenn Geschwindigkeit jemals ein Problem ist, würde ich davon ausgehen, dass ich nur die Implementierung in C neu schreiben muss.

Es hat bisher ziemlich gut geklappt, es so einfach wie möglich zu halten, und das funktioniert so wie es jetzt ist. Wenn ich jedoch finde, dass ich für fast jede Lösung eine andere Sprache in den Code einbette, frage ich mich, ob mir ein größeres Bild fehlt.

5
codykochmann

Es gibt zwei typische Möglichkeiten, dies auszudrücken.

Mit LIKE Infix-Suche:

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

oder mit position:

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

Beachten Sie, dass beide standardmäßig nicht indizierbar sind. Suchen Sie nach "Infix Search Index" für weitere Informationen und schauen Sie in pg_trgm wenn du es brauchst.

9
Craig Ringer