2016-06-01 17 views
0

Was ist der beste Weg, um eine facettierte Suche/Filter UI mit Postgres als Backend und Ruby on Rails als Frontend zu implementieren? Beispiel hierfür ist unter:Facettierte Filterung mit Postgres & Rails

faceted filtering example

+1

Werfen Sie einen Blick auf das Juwel 'pg_search'. https://github.com/Casecommons/pg_search – lcguida

Antwort

1

Verwenden Sie ThinkingSphinx oder Apache Solr - beide haben eine integrierte Facettierung. Sie können Ihre eigenen rollen (wie in einer anderen feinen Antwort gezeigt), aber meine Erfahrung sagt, dass Sie lieber eine echte Suchmaschine hinzufügen und die Facettierungsfunktion dort sowie die anderen Suchfunktionen nutzen. Ich benutze Solr für alle Neuentwicklungen, aber ThinkingSphinx ist im Allgemeinen ein wenig einfacher einzurichten und es hat neue Funktionen (hauptsächlich die kontinuierliche Indexierung), die es zu einem guten Anwärter machen.

+0

Ich habe ElasticSearch für ein anderes Projekt verwendet und es war großartig dafür, aber ich habe nicht die gleichen Ressourcen dafür, also muss es direkt in der Datenbank oder mit Rails machbar sein. – Avishai

+0

Ich stimme Michael zu, diese Lösung ist viel sauberer. Allerdings, wenn Sie eine kleine App mit ein paar Datensätze laufen, ist es ein wenig übertrieben imo – basgys

0

Ich denke, Rails stark genug ist, einfache Form Filter zu implementieren, wie oben gezeigt.

Sie müssen nur ein gutes Datenmodell haben und dann wird es einfach sein.

Beispiel:

E/R example

die Formularerstellung zu vereinfachen, obwohl Sie simple_form verwenden können, aber es ist auf jeden Fall optional.

+0

Dies ist ein großartiges Beispiel. Wie bekomme ich die Anzahl der Facettenergebnisse von Postgres, wie Farbe: {Blau: 50, Rot: 25, Schwarz: 182}, Größe: {Kompakt: 75, Mittel: 122}, etc.? – Avishai

+1

Sie können eine Auswahl aus Farbe treffen, Autos beitreten und dann nach Farbe gruppieren. Dasselbe gilt für die Größen. – basgys

0
select 
    (
     select json_object_agg(COALESCE(brand_id, 'null'), cnt) 
     from (
      select brand_id, COUNT(*) as cnt 
      from unnest(array_agg(brand_id)) as tmp(brand_id) 
      group by brand_id 
     ) ttt 
    ), 
    min(price) as price_min, 
    max(price) as price_max 
from product 
WHERE is_visible = true 
+0

Beachten Sie, dass, während die SQL gut aussieht, ich glaube nicht, dass dies die ursprüngliche Frage beantwortet, die war: "Wie dies über die Benutzeroberfläche zu erreichen gegeben a Postgres-Back-End und RoR-Frontend ". Ich denke, eine vollständigere Antwort würde beinhalten: "rufe einen paginierten API-Endpunkt auf, der eine Abfrage ähnlich der in der Antwort ausführt". – MSC