2015-05-26 8 views
10

Ich habe implementiert PgSearch auf meinem Node Modell wie folgt:Wie implementiere ich die erweiterte Suche mit Operatoren mit pg_search?

include PgSearch 
pg_search_scope :node_search, against: [:name, :user_id, :circa], 
    using: { tsearch: { any_word: true} }, 
    :associated_against => { 
     comments: [:message], 
     user: [:first_name, :last_name, :email], 
     memberships: [:relation] 
    } 

Und in meinem Controller Ich habe diese:

if params[:search] 
    @nodes = Node.node_search(params[:search]) 
end 

Idealerweise, was ich aber ist zu tun in der Lage sein möchten, haben jemand kann die Textdarstellung (eine Flagge) einer der Assoziationen eingeben und den Suchfilter nur auf diese Flagge haben.

z. sagen: "name: Bouncing Ball", wo die Suche nur auf der Spalte name auf dem Modell nodes stattfinden würde. Aka ... würde nach allen Knoten mit dem Namen Bouncing Ball suchen und nicht nach anderen Spalten oder Modellen oder auch nur nach den Assoziationen suchen.

Natürlich würde Ich mag zu können, sucht tun: owner: John Brown (die für alle Knoten sucht, deren Besitzer/Benutzer first_name und last_name sind John Brown), comment: Manhattan (die für alle Knoten durchsucht, um einen Kommentar mit dem haben Text Manhattan in der Kopie, und so weiter.

Wie erreiche ich dies mit PgSearch?

+0

Können Sie dies nicht im Controller mit einer Regex/String-Manipulation tun? Zum Beispiel einfach überprüfen, ob 'Besitzer:' als Teil von params [: search] existiert, und dann nur bedingte Logik verwenden? –

+0

@OliverM das klingt interessant. Können Sie mir ein Codebeispiel zeigen? Vielen Dank! – marcamillion

+0

Obwohl dies interessant scheint, bezweifle ich aber wirklich, dass es die Leistung überhaupt beeinflussen würde ... (unter der Annahme, dass alle Spalten, nach denen Sie suchen, richtig indiziert sind). Ich weiß, dass du nichts über die Leistung erwähnt hast und dass du das am besten brauchst, um die Ergebnisse zu filtern ... –

Antwort

4

Haben Sie eine Kombination von „Dynamic search scopes“ mit einigen Controller Verarbeitung des Suchbegriffs zu verwenden versucht?

name: Bob, analysieren Sie die Spalten/Beziehung und den Suchwert und übergeben Sie sie dann an einen pg_search_scope mit einem Lambda-Block?

+0

Kannst du mir einen Beispielcode zeigen, weil ich es nicht recht verstehen kann? – marcamillion