CPO4: Das Modul "Suche" (mod_search)

Diskussion zu nicht so umfangreichen Modulen und Start-Up für neue Module. Ansonsten bitte die speziellen Kategorien benutzen!
Antworten
Heike-Marie
ConPresso-Newbie
Beiträge: 23
Registriert: 05.08.2008 04:20
Wohnort: Vogelsberg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von Heike-Marie »

???
Da wird sonst nix geändert, bloß das was in dieser Textdatei steht. Ich habe heute früh allerdings noch einen Platzhalter für Fotosuche gebastelt. Man muss da aber die Dateiendung - .jpg oder so - mit im Suchfeld eingeben. Wenn der Suchbegriff dann einigermaßen zum Dateinamen passt, wird auch ein Foto angezeigt, falls vorhanden.
Mit Dateien, PDF oder so, hatte ich es auch probiert. Das habe ich nicht hinbekommen, obwohl es ja eigentlich genauso gehen müßte.

Ich hänge mal die komplette actions.inc.php dran, da ist das mit den Bildern auch schon geändert. Zusätzlich muss man dafür in der parser.inc.php bei dem "$sql_res_array[] = array(" ganz unten noch das hier "$v['bild'], //17" anfügen und dann drunter das "$replace_array[] = array ('<!-- SEARCH_PICTURE -->', '17');".

Den Search_Picture kann man dann ins Such-Modul einbauen und zwar so:
<img src="../_data/<!-- SEARCH_PICTURE -->">.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
shorty
ConPresso-User
Beiträge: 28
Registriert: 19.02.2007 10:23
Hat sich bedankt: 4 Mal

Beitrag von shorty »

Danke! Ich bin halt noch mehr Laie als du und so wusste ich mit
Das wiederholt man so für jeden $query, außer die For-schleife, die läuft über alle und wird natürlich ganz unten erst beendet.
nicht so recht was anzufangen.
Und was meinst du mit
Den eigentlichen noMatchesText habe ich in den Einstellungen weggelassen.
??
Hast du mir vielleicht auch noch eine beispielhafte worte.php? :oops:
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Habe mich mal durch Deine Änderungen durchgelesen.

Bei der eigentlichen Suche frage ich mich zuerst einmal, was

Code: Alles auswählen

shuffle($q_array);
und

Code: Alles auswählen

$query;
bewirken sollen?

Zum anderen scheint es Dich primär gestört zu haben, daß die Suche eine OR-Suche ist und hast sie in eine AND-Suche abgewandelt. Richtig?

Dann stellt sich aber die Frage, wozu Du noch die OR-Schleife von

Code: Alles auswählen

foreach ($q_array as $q)
in

Code: Alles auswählen

for ($i=1;$i < sizeof($q_array);$i++)
abgewandelt hast, wenn Du schon im ersten Durchgang alle Begriffe benutzt?

Nur am Rande sei erwähnt, daß mod_feature_search die Wahl zwischen AND und OR-Suche sowie noch massig weitere Optionen bietet...

Ich stelle mir nach wie vor eine Suche mittels Wortliste vor oder würde die Volltextsuche mittels match() in mySQL bevorzugen, die in 4er-Versionen sogar boolsche Operatoren wie "+ConPresso -Module -Suche" (also die Suche nach ConPresso aber ohne Module und Suche) bietet.
Dann könnte man sogar UNION-Abfragen benutzen und damit die gesamte Suche auf eine einzige Abfrage reduzieren, die dann komplett in der Datenbank abläuft...

Ansonsten finde ich es vollkommen ok, daß Du die Suche nach Wunsch abgeändert hast und hier die geänderten Dateien zur Verfügung stellst.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

MarkusR hat geschrieben:Ich stelle mir nach wie vor eine Suche mittels Wortliste vor oder würde die Volltextsuche mittels match() in mySQL bevorzugen, die in 4er-Versionen sogar boolsche Operatoren wie "+ConPresso -Module -Suche" (also die Suche nach ConPresso aber ohne Module und Suche) bietet.
Dann könnte man sogar UNION-Abfragen benutzen und damit die gesamte Suche auf eine einzige Abfrage reduzieren, die dann komplett in der Datenbank abläuft...
Um das mal zu verdeutlichen:
Diese Volltextsuche arbeitet mit einer Relevanz-Analyse.
Kommen von mehreren Suchbegriffen mehrere vor, dann hat die Fundstelle einen höhere Relevanz als eine Fundstelle mit nur einem der Suchworte. Gleichzeitig werden zu kurze Wörter nicht indiziert (unter 4 Zeichen) und Wörter, die zu häufig vorkommen (in min. 50% der Datensätze) werden ebenfalls als "Stopwörter" behandelt.
Eine Suche nach "der", "die" oder "das" fördert also grundsätzlich kein Ergebnis zutage, technisch gesehen falsch, aber logisch vollkommen in Ordnung.
Ebenfalls trägt das Verhältnis von Gesamtzahl der Wörter zur Anzahl der Fundstellen zur Relevanz bei.

http://dev.mysql.com/doc/refman/5.1/de/ ... earch.html

Ich teste das gerade mal durch mit einer Abfrage über 10.000 Datensätze und 14MB Datenvolumen...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Heike-Marie
ConPresso-Newbie
Beiträge: 23
Registriert: 05.08.2008 04:20
Wohnort: Vogelsberg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von Heike-Marie »

MarkusR hat geschrieben: Bei der eigentlichen Suche frage ich mich zuerst einmal, was

Code: Alles auswählen

shuffle($q_array);
und

Code: Alles auswählen

$query;
bewirken sollen?

Zum anderen scheint es Dich primär gestört zu haben, daß die Suche eine OR-Suche ist und hast sie in eine AND-Suche abgewandelt. Richtig?

Dann stellt sich aber die Frage, wozu Du noch die OR-Schleife von

Code: Alles auswählen

foreach ($q_array as $q)
in

Code: Alles auswählen

for ($i=1;$i < sizeof($q_array);$i++)
abgewandelt hast, wenn Du schon im ersten Durchgang alle Begriffe benutzt?
Ganz einfach: vorher war es so - um bei meinem Beispiel zu bleiben - "Hund schwarz" wurde gesucht. Gefunden wurden -zig Artikel in denen nur "Hund" vorkommt oder nur "schwarz" und ein paar wo beide Suchbegriffe drin sind. Man muss also praktisch nochmal selbst suchen, jedenfalls wenn's viele Ergebnisse gibt.
Deshalb eben "and" statt "or". Mit and werden die Begriffe aber nur in der eingegebene Reihenfolge gefunden: Hund and schwarz findet nicht schwarz and Hund.
Das Shuffle und die For-Schleife sollen hier bewirken, dass die Suchbegriffe solange wieder anders zusammengesetzt werden, bis alle Möglichkeiten durchgespielt sind und nur Artikel gefunden werden wo alle vorkommen, und das funktioniert auch, egal wieviel Worte man eingibt.
So ähnlich wie bei der Suche von Conpresso3 eben.

Dieses $query; oben ist wohl irgendwie vom Basteln übrig gewesen...

Ich verdiene mein Geld als Tierpfleger und bin kein Softwareentwickler. Mir macht es einfach nur Spaß rauszufinden wie sowas funktioniert.
Gehirnjogging sozusagen.
Heike-Marie
ConPresso-Newbie
Beiträge: 23
Registriert: 05.08.2008 04:20
Wohnort: Vogelsberg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von Heike-Marie »

shorty hat geschrieben: Hast du mir vielleicht auch noch eine beispielhafte worte.php? :oops:
Das würde Dir nicht viel nützen, es sei denn Deine Seite ist auch für einen Tierschutzverein...

Mach halt einfach eine leere php-Datei. Da schreibst Du rein:
return array('und','hier','in','die','Klammer','so','alle','Wörter');

Normale Wortlisten findet man über google.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Mit and werden die Begriffe aber nur in der eingegebene Reihenfolge gefunden: Hund and schwarz findet nicht schwarz and Hund.
Bist Du Dir da sicher? Eigentlich kann das nicht sein, da die Abfrage grundsätzlich nicht auf die Reihenfolge sondern nur auf das Vorhandensein der Begriffe achtet.

also ein
WHERE text like '%schwarz%' AND text like '%hund%'
ist identisch zu
WHERE text like '%hund%' AND text like '%schwarz%'

Ich will Dir das gerne glauben, aber eigentlich kann es nicht sein... :gruebel:
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Um die Optimierung der Suche weiter zu treiben bin ich gerade dabei ein modulares Modul zu entwickeln, das dann unterschiedliche "Search-Engines" benutzen kann.
Dazu müsste man vereinheitlichen, welche Platzhalter dadurch zur Verfügung gestellt werden. daraus kann dann der Parser die Ausgabe basteln...

Derzeit benutze ich:

pro Fundstelle
  • <!-- SEARCH_TITLE -->
    Der Artikeltitel
  • <!-- SEARCH_AUTHOR -->
    Der Autor
  • <!-- SEARCH_PUB_DATE -->
    Das formatierte Publikationsdatum
  • <!-- SEARCH_SHORT_CONTENT -->
    gekürzter Fundtext mit gehighlighteter erster (und ggf. weiterer) Fundstellen
  • <!-- SEARCH_CONTENT -->
    vollständiger Fundtext mit gehighlighteten Fundstellen
  • <!-- SEARCH_LINK -->
    Der Link zur Fundstelle
  • <!-- SEARCH_NUM -->
    Eine laufende Nummerierung
  • <!-- SEARCH_ARTICLE_ID -->
    Die Artikelnummer
  • <!-- SEARCH_RUBRIC -->
    Der Name der Rubrik
  • <!-- SEARCH_REL -->
    Die Relevanz der Fundstelle (formatiert)
  • <!-- SEARCH_WORD_MATCH -->
    Die Anzahl der Treffer innerhalb der Fundstelle
  • <!-- SEARCH_RUBRIC_ID -->
    Die ID der Rubrik
  • <!-- SEARCH_RUBRIC_DIR -->
    Das Verzeichnis der Rubrik
  • <!-- SEARCH_SCORE -->
    Die kalulierte Relevanz (unformatiert)
für die gesamte Suche
  • <!-- SEARCH_PHRASE -->
    Der eingegebene Suchstring
  • <!-- SEARCH_PAGES -->
    Die Paginierung
  • <!-- SEARCH_NAV -->
    Die Suchrubrik (zur Verwendung innerhalb des Formulares zur Steuerung der Navigation)
  • <!-- SEARCH_MESSAGE -->
    Evtl. auszugebende Meldungen
  • <!-- SEARCH_MATCHES -->
    Die Anzahl der Treffer als formatierter Text
Wobei nicht zwingend alle Platzhalter gefüllt werden müssen oder können (manches ist zwar zur Kontrolle ganz interessant, hilft aber bei der Suche nicht und belastet nur das System).

Welche Infos sollten noch ermittelt werden? Was könnte (wirklich) interessant sein?

Das mit der Relevanz sieht übrigens so wie im folgenden Bild aus und ist eine gute Mischung aus UND- und ODER-Abfrage, bei der die Gesamtwortzahl u.a. ins Verhältnis zur Trefferzahl gesetzt wird.
Dieser Code erzeugt die Ausgabe:

Code: Alles auswählen

<!-- START_SEARCH_MATCH -->
    <!-- SEARCH_NUM -->.) 
    <a href="<!-- SEARCH_LINK -->"><strong><!-- SEARCH_TITLE --></strong></a>
    (Rubrik: <strong><!-- SEARCH_RUBRIC --></strong>) -
    <strong><!-- SEARCH_AUTHOR --></strong> -
    <strong><!-- SEARCH_PUB_DATE --></strong>
    Artikel-Nr.: <strong><!-- SEARCH_ARTICLE_ID --></strong><br />
    <!-- SEARCH_SHORT_CONTENT --><br />
    <i><!-- SEARCH_REL --> <!-- SEARCH_WORD_MATCH --></i>
    <hr />
<!-- END_SEARCH_MATCH -->
( das "Es wurden keine Treffer zurückgeliefert." bitte nicht zu ernst nehmen. Tatsächlich sind es in diesem Fall 34 in 0,14 Sekunden )
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Heike-Marie
ConPresso-Newbie
Beiträge: 23
Registriert: 05.08.2008 04:20
Wohnort: Vogelsberg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von Heike-Marie »

MarkusR hat geschrieben:
also ein
WHERE text like '%schwarz%' AND text like '%hund%'
ist identisch zu
WHERE text like '%hund%' AND text like '%schwarz%'

Ich will Dir das gerne glauben, aber eigentlich kann es nicht sein... :gruebel:
So, jetzt habe ich alles nochmal durchprobiert - damit hast Du recht! Ich hatte zwischendrin versucht die einzelnen Begriffe mit % zu verknüpfen und sonstwas alles und da musste irgendwann die Reihenfolge eingehalten werden. Ich habe zuletzt, als es endlich klappte, nicht mehr nachgeprüft ob es anders auch geht. Irgendwie das Pferd von hinten aufgezäumt und bißchen umständlich.

Man kann also oben die foreach-Schleife stehen lassen und sich das shuffle und for sparen.

Was aber sein muss ist das q_array wirklich aufspalten, denn
"WHERE text like '%".$q."%' AND text like '%".$q."%'" bringt den gleichen Ergebniswust wie ohne AND.
Man muss es so schreiben:
"AND text like '%".(implode("%' AND text like '%",$q_array))."%' ", dann werden eben nur die paar Artikel - bestensfalls nur einer - gefunden, die alle eingegebenen Suchbegriffe enthalten.

Eine Suche nach Relevanz ist sicher gut für sehr umfangreiche Seiten, die ein großes Informationsangebot haben.

So, "Guten Rutsch" erstmal an alle - ist ja bald soweit!
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Habe meine Volltextsuche mal als Modul zum Testen bereitgestellt
http://community.conpresso.de/viewtopic.php?t=4144
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Heike-Marie
ConPresso-Newbie
Beiträge: 23
Registriert: 05.08.2008 04:20
Wohnort: Vogelsberg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von Heike-Marie »

So - was lange währt...

Ich habe "meine" Seite endlich fertig und wenn's noch interessiert, kann man die umgebaute Suche ausprobieren.
Ich habe noch ein bißchen dran gebastelt, Bilder und Dateien werden auch gefunden und angezeigt (PDF direkt zum downloaden), und Besucher können die zu durchsuchende Rubrik auswählen. Dafür hatte ja jemand mal ein Codeschnipsel hier irgendwo gepostet, den ich mir angepasst habe.

Hier mal ein Suchlink auf die Seite mit eingebauten Tippfehlern, hoffentlich klappt das so:
scheferhund männlivh

Heike
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 01:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

Der Platzhalter <!-- SEARCH_LINK --> von mod_search liefert ja eigentlich einen brauchbaren Link, um direkt zum entsprechenden Artikel (auf der Index- oder Rubrikseite) zu springen. Die Link-Adresse sieht bspw. so aus:

http://www.domain.tld/_rubric/index.php ... nr=341#341

'341' wäre in diesem Fall die Artikelnummer, zu welcher beim Anklicken des Links gesprungen wird

Voraussetzung ist natürlich, dass es ein entsprechendes Sprungziel gibt. Das kann leicht erreicht werden, indem man die Artikelnummer über das entspr. Template in Form einer id bzw. eines Sprungziel-Ankers ausgibt, also im Template an geeigneter Stelle etwas wie

<div id="<!-- Value: articlenr -->"> ... </div>

bzw.

<a name="<!-- Value: articlenr -->"></a>

einsetzt. Leider - und da komme ich zum eigentlichen Knackpunk, weshalb ich diesen Beitrag überhaupt schreibe - ist eine id, welche mit einer Ziffer beginnt nicht valide. Gleiches gilt für das mit einer Ziffer beginnende name-Attribut.

Ich schlage deshalb vor, die parser.inc.php von mod_search etwas zu modizifieren:

Man suche in dieser Datei nach den Zeilen (etwa bei Zeile 100)

Code: Alles auswählen

            // index
            $link = BASE_REL . $rubrics[$v['rubric_id']]['directory'] . '/index.php?rubric=' . urlencode($rubrics[$v['rubric_id']]['name']) . '&nr='.(int)$v['nr'].'#'.(int)$v['nr'];
        } else {
            // archive
            $link = BASE_REL . $rubrics[$v['rubric_id']]['directory'] . '/archive.php?rubric=' . urlencode($rubrics[$v['rubric_id']]['name']) . '&nr='.(int)$v['nr'].'#' . (int)$v['nr'];

und ersetze diese durch

Code: Alles auswählen

            // index
            $link = BASE_REL . $rubrics[$v['rubric_id']]['directory'] . '/index.php?rubric=' . urlencode($rubrics[$v['rubric_id']]['name']) . '&nr='.(int)$v['nr'].'#art'.(int)$v['nr'];
        } else {
            // archive
            $link = BASE_REL . $rubrics[$v['rubric_id']]['directory'] . '/archive.php?rubric=' . urlencode($rubrics[$v['rubric_id']]['name']) . '&nr='.(int)$v['nr'].'#art' . (int)$v['nr'];

I.e., das Hash-Zeichen '#' wird ersetzt durch '#art'.

Demzufolge müsste dann im Template

<div id="art<!-- Value: articlenr -->"> ... </div>

bzw.

<a name="art<!-- Value: articlenr -->"></a>

verwendet werden, da die o.g. Zieladresse des Links sich dadurch zu

http://www.domain.tld/_rubric/index.php ... 341#art341

geändert hat.
Günther Ludwig
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

ist eine id, welche mit einer Ziffer beginnt nicht valide. Gleiches gilt für das mit einer Ziffer beginnende name-Attribut
Kann man das irgendwo nachlesen?
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 01:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

Günther Ludwig
Antworten