2016-08-01 16 views
-1

Wir erstellen eine Anwendung, die mehrere verschiedene Entitäten hat, die ziemlich einfach sind mit Name & Beschreibung und einige spezifische Sachen.Symfony Suche mit Tags

Jetzt möchten wir Tags hinzufügen, um zusätzliche Suchbegriffe hinzuzufügen. (Es wird auch irgendwo eine Tagwolke geben, aber das ist einfach)

Ich habe auf verschiedene Arten nachgelesen, um eine richtige Suche zu machen. Lösungen wie Lucene, Elastic, Mysql Fulltext und vieles mehr.

Hat jemand Erfahrung, um auf die beste Lösung für eine Anwendung wie diese zu teilen?

  1. Sollte ich die Tags in der gleichen Tabelle in einem String/Array-Feld setzen? Verwenden Sie einen separaten Tisch? Ich habe auch gefunden DoctrineExtensions-Taggable, die ziemlich anständig scheint und es auch leicht machen wird, eine tagcloud zu machen.
  2. Für eine richtige Suche über Name, Beschreibung & Tags, was ist die beste Lösung? Lucene? elastisch? myssql? Bis jetzt denke ich, dass die FOSElasticaBundle am ausgereiftesten aussieht, aber nicht sicher, wie man die Suche nach Tags dort hinzufügt? (siehe 1)

Danke für den Hinweis!

+1

Wenn Sie in http://www.inanzzz.com/ nach dem Schlüsselwort elasticsearch suchen, sehen Sie viele Beispiele für Symfony + Elasticsearch, die Ihnen dabei helfen können, das zu erreichen, was Sie erreichen möchten. – BentCoder

Antwort

1

"Was ist das Beste ..." ist normalerweise kein guter Weg, hier zu fragen, und Sie werden entweder sehr eigenwillige oder gar keine Antworten bekommen.

So, hier ist meine eigenwillige Antwort: (! Sie Lehre lehren müssen, wie es zu benutzen)

Wenn Sie eine kleine Gruppe haben, können Sie sicher mit MySQL und MATCH AGAINST laufen. Es ist das Einfachste, was zu tun ist, weil Sie bereits Doctrine haben und es nur ein bisschen unterrichten müssen. Also ja, Gedmo Taggable und ein bisschen von deiner eigenen Doctrine Extension und du hast deine Queries.

Wenn Ihre durchsuchbare Datenbank größer wird, sollten Sie zu einer geeigneten Suchmaschine wie Elastic oder Solr oder was auch immer wechseln.

Was Sie dort brauchen, wird normalerweise "facettierte Suche" genannt (oder in ElasticSearch heißen sie heutzutage "Aggregationen").

Mehr über facettierte Suche finden Sie zum Beispiel auf Wikipedia.

Ja, eine richtige Suchmaschine ist cooler und schneller und auffälliger, aber wenn Sie an einem Zeitplan und zum ersten Mal arbeiten, ist es möglicherweise nicht die beste Lösung.

+0

Danke, dass du dir die Zeit genommen hast zu antworten :) Deine Antwort beantwortet den zweiten Teil meiner Frage, aber der erste Teil ist noch ein wenig verschwommen. Wenn ich die MySQL-Volltextsuche mit dem Taggable verwenden möchte, weiß ich nicht, wie ich mit einer einzigen Abfrage alles durchsuchen würde. Ich könnte wahrscheinlich eine separate Suche in jeder Tabelle durchführen und nach präzisen Übereinstimmungen auf Tags suchen. Wäre das der logischste Weg, dies zu tun? –

+0

oops, sorry, ich dachte eigentlich, dass das taggable Teil der gedmo doctrine extensions ist. Wenn ich es anschaue, denke ich, dass du mit einer vielfachen Beziehung zu Tags besser zurechtkommst und in der Tag-Entität nach deinen Matches suchst und die Beziehungen daraus hervorbringst. – Koalabaerchen

+0

Am Ende denke ich, dass ich MySQL-Volltextsuche verwenden werde und ich denke, es ist viel praktischer, die Tags in einem String-Feld in der Tabelle zu haben.Ich habe einen intelligenten LifecycleListener erstellt, um Aktualisierungen von Tags zu erfassen und sie auch einer Tag-Entität hinzuzufügen. Auf diese Weise hoffe ich, das Beste aus beiden Welten zu haben. Ich kann weiterhin eine Tagcloud anzeigen, aber auch eine einfache Suche durchführen. Ich hoffe nur, dass die MySQL-Volltextsuche nicht langwierig sein wird, wenn ich über 5 verschiedene Tabellen gehe, aber ich denke, es wird für jetzt ausreichen. –