Forum: Rails Germany Ultrasphinx Ergebnisse darstellen

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Torsten F. (Guest)
on 2009-03-22 10:56
(Received via mailing list)
Guten morgen zusammen,

ich nutze Ultrasphinx, weil es mir einfach ermöglicht, alle gewünschten
Models incl. der gewünschten Attribute zu indizieren und daraus eine
Volltextsuche über den *ganzen* Webauftritt zu ermöglichen - bzw. ich
_möchte_ es nutzen ;)

Nun zur Frage:
Indizieren, Suchen und Finden klappt ganz hervorragend aber wie stelle
ich die Ergebnisse dar? Die Suche nach einem Begriff liefert mir

* die Objekte in denen der Suchbegriff vorkommt.
* ALLE Eigenschaften der relevanten Objekte (obwohl ich dediziert
  angegeben habe, welche Datenbankspalten ich indiziert haben möchte:
  is_indexed :fields => ['name', 'nick', 'description', 'info']
  im Member-Model. Gefunden wird aber auch das Passwort! - was
  insofern logisch ist, als das das Passwort eine Eigenschaft des
  Models ist.

Wie dem auch sei: Was soll ich nun mit den Objekten anfangen?
Natürlich könnte ich stupide in jede Eigenschaft eines Objektes
hineinschauen, prüfen, ob der Suchtext darin vorkommt und dann
entsprechendes HTML generieren - aber das kanns doch nicht sein?

Jewede Dokumentation darüber, wie die Ergebnisse in den Browser wandern
soll, scheint schlicht und ergreifend nicht zu existieren.
Hat jemand Erfahrung damit?

Gruß
Torsten
Stefan F. (Guest)
on 2009-03-22 18:09
(Received via mailing list)
Hi Torsten,


Am 22.03.2009 um 09:55 schrieb Torsten F.:

> ich die Ergebnisse dar? Die Suche nach einem Begriff liefert mir
>
> * die Objekte in denen der Suchbegriff vorkommt.
> * ALLE Eigenschaften der relevanten Objekte (obwohl ich dediziert
>  angegeben habe, welche Datenbankspalten ich indiziert haben möchte:
>  is_indexed :fields => ['name', 'nick', 'description', 'info']
>  im Member-Model. Gefunden wird aber auch das Passwort! - was
>  insofern logisch ist, als das das Passwort eine Eigenschaft des
>  Models ist.

hmm, wenn ich den Satz aus der Doku:

"Ultrasphinx uses the find_all_by_id method to instantiate records."

richtig interpretiere, dann funktioniert das Suchen in zwei Schritten:
abgelegt werden im Index nur id und typ, die eigentlichen Objekt
werden dann per find_all_by_id instanziiert - das ist dann ein ganz
normaler ActiveRecord-Call und daher auch schon wieder unabhängig von
us - daher kann man auch erwarten, dass man ein ganz normales
ActiveRecord-Objekt in der Hand hat (hier kommt auch wieder das
paginieren ins Spiel: das verhindert, dass man plötzlich die ganze
Datenbank per find_by_id in der Hand hat...).
>
> Wie dem auch sei: Was soll ich nun mit den Objekten anfangen?
> Natürlich könnte ich stupide in jede Eigenschaft eines Objektes
> hineinschauen, prüfen, ob der Suchtext darin vorkommt und dann
> entsprechendes HTML generieren - aber das kanns doch nicht sein?

Wie man die Suchergebnisse dann anzeigt, dass ist dann Sache der
Anwendung: Meist hat man da ja verschiedene Objekte in der
Ergebnismenge und für jedes Objekt muss man zwei Sachen Überlegen:

1) wie soll es sich auf der Suchergebnisseite darstellen: hier machen
wir z.B. auf jedes suchbare Objekte eine methode summary, die dann
jeweils einen Text zurückgibt, den man auf so einer Seite anzeigen kann.
2) Wohin soll das Suchergebnis verlinken: Wenn Du z.B. Blogposts und
Benutzer suchen lässt, dann würdest Du auf die Anzeigeseite
für  Blogposts oder auf eine Übersichtsseite  des Benutzers  verlinken. Das
ist, wie gesagt, sehr anwendungsspezifisch.


>
> Jewede Dokumentation darüber, wie die Ergebnisse in den Browser
> wandern
> soll, scheint schlicht und ergreifend nicht zu existieren.
> Hat jemand Erfahrung damit?

Einen Controller, der das Suchfeld entgegennimmt und die Darstellung
des Suchergebnis und das paginieren macht, hast Du schon?!  Dann kann
man im vier über die results einfach iterieren, z.B.:

@search = Entry.search(@query, params[:page])
@results = @search.results
@total_entries = @search.total_entries


Hilft das schon irgendwie weiter?!

GrüßeStefan
Torsten F. (Guest)
on 2009-03-22 19:10
(Received via mailing list)
Stefan F. schrieb:
>> _möchte_ es nutzen ;)
>>  insofern logisch ist, als das das Passwort eine Eigenschaft des
> kann man auch erwarten, dass man ein ganz normales ActiveRecord-Objekt
> in der Hand hat (hier kommt auch wieder das paginieren ins Spiel: das
> verhindert, dass man plötzlich die ganze Datenbank per find_by_id in der
> Hand hat...).

soweit ok

>> Wie dem auch sei: Was soll ich nun mit den Objekten anfangen?
>> Natürlich könnte ich stupide in jede Eigenschaft eines Objektes
>> hineinschauen, prüfen, ob der Suchtext darin vorkommt und dann
>> entsprechendes HTML generieren - aber das kanns doch nicht sein?
>
> Wie man die Suchergebnisse dann anzeigt, dass ist dann Sache der
> Anwendung: Meist hat man da ja verschiedene Objekte in der Ergebnismenge

und da liegt der Hase im Pfeffer...

> und für jedes Objekt muss man zwei Sachen Überlegen:
>
> 1) wie soll es sich auf der Suchergebnisseite darstellen: hier machen
> wir z.B. auf jedes suchbare Objekte eine methode summary, die dann
> jeweils einen Text zurückgibt, den man auf so einer Seite anzeigen kann.

kannst Du das etwas näher erläutern?

Ich stelle mir da so etwas wie ein "virtuelles Attribut" vor, das dann
in jedem gefundenen Objekt als Methode zur Verfügung steht und sich aus
den indizierten Spalten zusammensetzt. So kann ich einfach aüber die
gefundenen Objekte iterieren und auf diese "Standard"-Methode zugreifen.

Liege ich richtig?

> 2) Wohin soll das Suchergebnis verlinken: Wenn Du z.B. Blogposts und

im Moment baue ich den Link auf den gefundenen Artikel (die Seite)
zusammen (sehr häßlich!) und setze ihn in in <li></li> Element - noch
häßlicher ;)

Gruß, Torsten
Stefan F. (Guest)
on 2009-03-22 19:56
(Received via mailing list)
>
>
> Ich stelle mir da so etwas wie ein "virtuelles Attribut" vor, das dann
> in jedem gefundenen Objekt als Methode zur Verfügung steht und sich
> aus
> den indizierten Spalten zusammensetzt. So kann ich einfach aüber die
> gefundenen Objekte iterieren und auf diese "Standard"-Methode
> zugreifen.
>
> Liege ich richtig?

na, ich weiß nicht, ob man das unbedingt automatisch zusammen bauen
will: also entweder ein methode summary, die man dann pro Objekt
anders überschrieben wird (mal blogpost.text, mal user.description
zurück gibt...) oder als Alternative im view pro Objekt ein  anderes
Template ziehen, das dann jeweils für das Objekt die entsprechenden
Felder rendert.
>
>> 2) Wohin soll das Suchergebnis verlinken: Wenn Du z.B. Blogposts und
>
> im Moment baue ich den Link auf den gefundenen Artikel (die Seite)
> zusammen (sehr häßlich!) und setze ihn in in <li></li> Element - noch
> häßlicher ;)

das ließe sich dann ebenfalls über das template-pro-objekt erschlagen:
da kennt man dann schon den Typ des objekts und das Template weiß
dann, wo es hinlinken muss...

gruß
stefan
Torsten F. (Guest)
on 2009-03-23 09:11
(Received via mailing list)
On Sun, 22 Mar 2009 18:56 +0100, "Stefan F."
<removed_email_address@domain.invalid> wrote:
> > aus
> Template ziehen, das dann jeweils für das Objekt die entsprechenden
> Felder rendert.

Danke für Deine Hilfe.
Ich werds mal probiern...

Gruß
Torsten
Torsten F. (Guest)
on 2009-03-23 20:13
(Received via mailing list)
Stefan F. schrieb:
>> und da liegt der Hase im Pfeffer...
>> in jedem gefundenen Objekt als Methode zur Verfügung steht und sich aus
>> den indizierten Spalten zusammensetzt. So kann ich einfach aüber die
>> gefundenen Objekte iterieren und auf diese "Standard"-Methode zugreifen.
>>
>> Liege ich richtig?
>
> na, ich weiß nicht, ob man das unbedingt automatisch zusammen bauen
> will: also entweder ein methode summary, die man dann pro Objekt anders
> überschrieben wird (mal blogpost.text, mal user.description zurück
> gibt...) oder als Alternative im view pro Objekt ein  anderes Template
> ziehen, das dann jeweils für das Objekt die entsprechenden Felder rendert.

Ich mach das jetzt mal so - ich sehe keine bessere Alternative:
Ich definiere ein virtuelles Attribut in jedem Model, das ich
indizieren will und vergebe 3 Standardeigenschaften im Ergebnishash
(3 ist jetzt mal willkürlich gewählt!):

def summary
  { :title => self.title, :body => self.body, :url => nil }
end

Für :url vergebe ich im Beispiel noch NIL weil ich mir noch
Gedanken über den Link machen muss - aus dem Model ist das eher
kompliziert - ein "geht nicht" akzeptiere ich aber nicht :)
Vielleicht ersetze ich :url durch was anderes oder lasse es
ganz weg aber der Grundgedanke sollte passen.

Die anderen 2 Eigenschaften kann ich auf 'self.content' oder
'self.headline' setzen - was das Objekt halt hergibt...
Nach außen hin schaut es immer gleich aus!

So kann ich über jedes gefundene Objekt iterieren,
prüfen,ob es auf 'summary' reagiert und die Felder in *einer* View
ausgeben. Ist sicher nicht optimal, aber im Moment fällt mir
nichts besseres ein - man muss eh jedes Model zum indizieren
anfassen, auf 3 Zeilen mehr kommt es dann auch nicht mehr an.

Und da in meinen Models fast jedesmal eine andere Methode
zum gesuchten Text führt (Asche auf mein Haupt), hält sich
ein Verstoß gegen DRY in Grenzen ;)

Auf jeden Fall ein dickes Danke für den Tip!
Torsten
This topic is locked and can not be replied to.