Neues Modul: Suche

Begonnen von Webfan, 26 Oktober 2011, 17:52:47

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Webfan

Hallo  :bye:
Webfan veröffentlich heute ein weiteres PragmaMx Modul:
Das neue Modul ermöglicht eine modulübergreifende Suche im PragmaMx.
Das "Ranking" und andere Einstellungen können in der Suche.config.php frei konfiguriert werden.
Das hinzufügen neuer Module zur Suche ist ganz einfach in 2 Schritten möglich:
1) Anhand der Vorlagen in  der Suche.functions.php eine Funktion erstellen
2) Modul in Suche.config.php entsprechend hinzufügen

Demo: http://outshop.de (Suchfeld links)

Viel Spaß  :drinks:

Achja, fast vergessen: Download: http://www.webfan.de/Downloads-lid-Suche-Suchemodul-fuer-das-PragmaMx-58.html


Webfan

#1
Ooops, hab noch was vergessen, bitte mit dem DL 15min warten...

EDIT: So fertig!
 (hatte vergessen eine Funktion deadyoumean von algebre auch aufzurufen, Download ist korrigiert)

Nochmal Edit: Natürlich heißt die Funktion nicht "dead"you mean  ;) sondern did

trulla

 :)
ZitatMySQL meldet:

#1071 - Specified key was too long; max key length is 1000 bytes

Eine Datenbank wird dennoch angelegt, aber die Suche funktioniert nicht

Webfan

Moin,
CREATE TABLE `{prefix}_suche_cache` (
`query` TEXT NOT NULL ,
`url` TEXT NOT NULL ,
`preview` TEXT NOT NULL ,
`module` VARCHAR( 255 ) NOT NULL ,
`ranking` DECIMAL( 20, 2 ) NOT NULL DEFAULT '0',
`time` TEXT NOT NULL
) ENGINE = MYISAM ;
ALTER TABLE `{prefix}_suche_cache` ADD PRIMARY KEY ( `query` ( 480 ) , `url` ( 480 ) ) ;
ALTER TABLE `{prefix}_suche_cache` ADD `title` VARCHAR( 255 ) NOT NULL ;

Ändere das ganze mal wie folgt ab:

CREATE TABLE `{prefix}_suche_cache` (
`query` VARCHAR( 255 )  NOT NULL ,
`url` VARCHAR( 255 )  NOT NULL ,
`preview` TEXT NOT NULL ,
`module` VARCHAR( 255 ) NOT NULL ,
`ranking` DECIMAL( 20, 2 ) NOT NULL DEFAULT '0',
`time` TEXT NOT NULL,
`title` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM ;
ALTER TABLE `{prefix}_suche_cache` ADD PRIMARY KEY ( `query`, `url` ) ;

So oder so ähnlich, vielleicht weiß jemand besseren Rat, was man für Felder nehmen sollte  :red:, kommt drauf an wie lang die urls sein dürfen und der Suchquery...!?

mfg

trulla

 :) Guten Morgen

die schlechte Nachricht: Die Fehlermeldung ist die gleiche
Gute Nachricht:  die Suche funzt trotzdem
------------------

nächste Frage:
um auch die Rezepte zu durchsuchen habe ich folgenden code gefunden
'Rezept' => array( 1,1, 'funcSucheMod_Rezept' ),

Muss ich mir in der Suche_functions.php nun noch selbst eine Funktion basteln, damit diese auch durchsucht werden?

Webfan

Zitat
die schlechte Nachricht: Die Fehlermeldung ist die gleiche
Gute Nachricht:  die Suche funzt trotzdem

Du solltest unbedingt die Felder "query" und "url"  zusammen als Primary Key setzen.
Wenn mein Code dazu nicht funzt (sorry), logge Dich in phpMyAdmin ein
- wähle die TAbelle _suche_cache
- Klicke oben den Reiter "Struktur"
- Suche das Feld "Index über 2 Spalten anlegen
- Wähle als Key Primary und als Felder "url" und "query"
- Versuche die größtmögliche Keygrösse einzustellen

Zitatum auch die Rezepte zu durchsuchen habe ich folgenden code gefunden
'Rezept' => array( 1,1, 'funcSucheMod_Rezept' ),

Muss ich mir in der Suche_functions.php nun noch selbst eine Funktion basteln, damit diese auch durchsucht werden?
Ja, das mußt Du. Leider bin ich noch nicht dazu gekommen das Rezeptmodul zu implementieren, ich werde es mir aber die Tage runterladen und eine Funktion bereitstellen, sorry das es nicht früher geht, vielleicht ist aber auch jemand anderes schneller damit?
Aber ich notiers mir...

mfg

trulla

 :red: ich krieg das nicht hin

ZitatMySQL meldet:

#1089 - Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys

Webfan

Wenn Du das Menü um den Key einzustellen aufrufst, mußt Du jweils in das erste Feld (per Selectbox) das Feld auswählen im Feld rechts daneben die Keylength eintragen.
Zitatthe used length is longer than the key part
Sorry, vielleicht war meine Aussage oben mißverständlich, mit TEXT als Feldtyp probiere die größtmögliche Keygröße, wenn VARCHAR versuche mal 256 als Keygröße, oder bzw. das Feld Keygröße einfach leerlassen.

Wenn das alles nichts fruchtet, sende mir mal bitte Deine phpMyAdmin Zugangsdaten per Mail, ich schaue mir das dann heute abend mal an (bin jetzt erstmal gleich weg vom PC).

Viele Grüße
:bye:

anmShinichi

So Simple wie genial... An eine Suche dieser Art habe ich nicht gedacht, sie zu haben, ist aber Gold wert. Ich habe kein Gold für dich, aber erstmal auf jeden Fall ein großes DANKE SCHÖN.

Werde es bei uns installieren und einrichten.

LG
MonsterWorks - www.monsterworks.de

Webfan

@anmShinichi: Danke für das Lob  :smile:

@petra: Problem war folgendes:
Deine Tabelle hatte die Kollation utf8_, das belegt 3byte pro Zeichen.
Ich habe jetzt die Kollation auf latin_swedish umgestellt, die beiden PK Felder sind jetzt VARCHAR (255) mit entsprechend langem Key. Du kannst jetzt
- entweder es einfach so lassen
- wenn längere Texte gewünscht sind, die Felder auf TEXT und Key Länge jweils 500 einstellen
- wenn utf8 gewünscht ist, die Tabelle wieder auf utf8 umstellen, und die Keylength auf jeweils auf bis zu 166 setzen (wenn ich mich nicht verrechnet hab)

Wenn ich eines der obigen Dinge für Dich tun soll, laß es mich wissen.


mfg



trulla

Danke für deine Mühe, aber die Suche findet nicht einen Begriff, den ich eingebe. Ich fürchte, da stimmt immer noch was nicht

Webfan

 :red: ich schaus mir an, moment bitte...

Webfan

Ok, sorry, mit latin ging es nicht. Hab nun Kollation wieder auf utf8 umgestellt nun  scheint es zu gehen:
http://www.pewro.de/modules.php?q=test&BTN_search=Suchen...&name=Suche
:bye:

trulla

Danke, nun funktioniert die Suche. :)

:thumbup:

Webfan

Moin,

eine mögliche Funktion um das Rezeptmodul in das Suchmodul zu implementieren könnte wie folgt aussehen. Achtung: Ich habe das Rezeptmodul nicht installiert und die Funktion nicht getestet, Fehler bitte hier melden.

Einzufügen in die Suche.functions.php:
#####################################################################################
function funcSucheMod_Rezept($cq, $q, $rankingDEF)
{
global $prefix;
global $SucheSettingsDefault;

 $sqlq="SELECT * FROM ".$prefix."_recipes
                                  WHERE
                                   recipename LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   description LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   ingredients LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   directions LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   nutrition LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   tipps LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   catname LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  ";
  $result = sql_query($sqlq);
  while($row = sql_fetch_array($result) )
    {
        $ranking = $rankingDEF;

        if($cq == $q)$ranking = $ranking + _SUCHE_RANKING_COMPLETE_QUERY_;

        $countwords= substr_count($row['recipename'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TITLE_MATCH_);

       $countwords= substr_count($row['catname'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TITLE_MATCH_);

                                               

        $countwords= substr_count($row['description'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TEXT_MATCH_);
       
        $countwords= substr_count($row['ingredients'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TEXT_MATCH_);
       
        $countwords= substr_count($row['directions'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TEXT_MATCH_);
       
        $countwords= substr_count($row['nutrition'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TEXT_MATCH_);
       
        $countwords= substr_count($row['tipps'],  strip_tags($q));
        $ranking = $ranking + ($countwords * _SUCHE_RANKING_TEXT_MATCH_);                                    


$contentpreview = substr(strip_tags($row['description']), 0, strlen($q) ).'... .... '
                 .substr(strip_tags($row['description']), strnpos(strip_tags($row['description']), strip_tags($q), 1), 580).'...';


  if(!preg_match("/".$q."/", $row['description']))
  {
$contentpreview = substr(strip_tags($row['ingredients']), 0, strlen($q) ).'... .... '
                 .substr(strip_tags($row['ingredients']), strnpos(strip_tags($row['ingredients']), strip_tags($q), 1), 580).'...';  
 
  }


  if(!preg_match("/".$q."/", $row['ingredients']))
  {
$contentpreview = substr(strip_tags($row['directions']), 0, strlen($q) ).'... .... '
                 .substr(strip_tags($row['directions']), strnpos(strip_tags($row['directions']), strip_tags($q), 1), 580).'...';  
 }
 
    if(!preg_match("/".$q."/", $row['directions']))
  {
$contentpreview = substr(strip_tags($row['nutrition']), 0, strlen($q) ).'... .... '
                 .substr(strip_tags($row['nutrition']), strnpos(strip_tags($row['nutrition']), strip_tags($q), 1), 580).'...';  
 }
    if(!preg_match("/".$q."/", $row['nutrition']))
  {
$contentpreview = substr(strip_tags($row['tipps']), 0, strlen($q) ).'... .... '
                 .substr(strip_tags($row['tipps']), strnpos(strip_tags($row['tipps']), strip_tags($q), 1), 580).'...';  
 }
 
 
          $contentpreview =  str_ireplace("".strip_tags($q)."",
                        '<font style="'._SUCHE_HIGHLIGHT_FONTSTYLE_.'">'
                        .strip_tags($q).
                        '</font>',
                         strip_tags($contentpreview)  );

        $link = 'modules.php?name=recipes&amp;recipe='.$row['id'];

        $sqlq2="INSERT INTO ".$prefix._SUCHE_TABLENAME_CACHE_."
                                              SET
                                               query='".mxAddSlashesForSQL(strip_tags($cq))."',
                                               url='".mxAddSlashesForSQL(strip_tags($link))."',
                                               preview='".mxAddSlashesForSQL($contentpreview)."',
                                               module='recipes',
                                               ranking='".mxAddSlashesForSQL(strip_tags($ranking))."',
                                               time='".intval(_SUCHE_JETZT_SEKUNDEN_)."',
                                               title='".mxAddSlashesForSQL(strip_tags($row['recipename']))."'
                                               ";
        sql_query($sqlq2);
    }


}
#####################################################################################


Einzufügen in die Suche.config.php in das $SucheSettingsDefault Array:
'Rezept' => array( 1,1, 'funcSucheMod_Rezept' ),

Ranking: Wenn gewollt ist, daß das Suchmodul eine höhere Gewichtung bei der Suche erhält kann das zweite Array Element erhöht werden, z.B.:
'Rezept' => array( 0,1.5, 'funcSucheMod_Rezept' ),



Wichtiger Hinweis zum Suchmodul:
Was ich noch nicht geschrieben habe, aber beachtet werden sollte: Je nach Suchanfragen können in der cache Tabelle erhebliche Datenvolumen entstehen, es sollte also noch Datenbankspeicher in bis zu etwa 50-100% der Größe der bisherigen PMX Tabellen zur Verfügung stehen (oder mehr).

:bye:

trulla

 :) Guten Morgen,

leider klappt das nicht. Das Rezeptmodul wird so nicht durchsucht.

Webfan

Mh  :gruebel:  Hast Du mal geschaut, ob Du über den Debug Mode Meldungen erhälst?
mfg

Webfan

...Aber ich hab eine Idee...
Kann es sein, daß das Feld catname nicht im recipies Table vorhanden ist, sondern nur in der cat Tabelle?

Versuche mal den Query umzuändern auf:

 $sqlq="SELECT * FROM ".$prefix."_recipes
                                  WHERE
                                   recipename LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   description LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   ingredients LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   directions LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   nutrition LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  OR
                                   tipps LIKE '%".mxAddSlashesForSQL(strip_tags($q))."%'
                                  ";


mfg

trulla

 :thumbup:

So klappt es . Eins irritiert mich noch.
ZitatRanking: Wenn gewollt ist, daß das Suchmodul eine höhere Gewichtung bei der Suche erhält kann das zweite Array Element erhöht werden, z.B.:
'Rezept' => array( 0,1.5, 'funcSucheMod_Rezept' ),

Muss es nicht heissen (1,1.5, 'funcSucheMod_Rezept' ),

Funktioniern allerdings beide Varianten. Allerdings gebe ich Kürbis ein, müsste dann Nicht Kürbiseintopf ganz oben stehen? Vor einem Begriff aus dem Contentmodul?

Webfan

#19
ZitatRanking: Wenn gewollt ist, daß das Suchmodul eine höhere Gewichtung bei der Suche erhält kann das zweite Array Element erhöht werden, z.B.:
'Rezept' => array( 0,1.5, 'funcSucheMod_Rezept' ),

Muss es nicht heissen (1,1.5, 'funcSucheMod_Rezept' ),
Hä? Wo ist denn da der Unterscheid= 'Rezept' => muß aufjedenfall da stehe, daß is der Key des Modul Arrays, jedes Element ist auch wieder ein Array:
$SucheSettingsDefault = array(
//Core...
'News' => array( 1,1, 'funcSucheMod_News' ),
'Userinfo' => array( 1,1, 'funcSucheMod_Userinfo' ),
'Sections' => array( 1,1, 'funcSucheMod_Sections' ),
'comments' => array( 1,1, 'funcSucheMod_comments' ),
'Content' => array( 1,1.5, 'funcSucheMod_Content' ),
'Topics' => array( 1,1, 'funcSucheMod_Topics' ),
'Downloads' => array( 1,1, 'funcSucheMod_Downloads' ),
'Web_Links' => array( 1,1, 'funcSucheMod_Web_Links' ),
'Rezept' => array( 1,1, 'funcSucheMod_Rezept' ),
//Addons...
'Annoncen' => array( 1,1, 'funcSucheMod_Annoncen' ),
//Addons Todo..
//'eBoard' => array( 0,1, 'funcSucheMod_eBoard' ),
//'My_eGallery' => array( 0,1, 'funcSucheMod_My_eGallery' ),
//'SMF' => array( 0,1, 'funcSucheMod_SMF' ),
'Rezept' => array( 1,1, 'funcSucheMod_Rezept' ),
//'Reviews' => array( 0,1, 'funcSucheMod_Reviews' ),
);

oder halt 'Rezept' => array( 1,1.5, 'funcSucheMod_Rezept' ), oder 'Rezept' => array( 1,XX.XX, 'funcSucheMod_Rezept' ),
----------
EDIT: Ich hab den Unteschied jetz gesehen (oben )  :red:
NAtürlich muß zuerst eine 1 da stehen!
-----------
ZitatFunktioniern allerdings beide Varianten. Allerdings gebe ich Kürbis ein, müsste dann Nicht Kürbiseintopf ganz oben stehen? Vor einem Begriff aus dem Contentmodul?
Aaaalso...
Der oben genannte Wert ist das "Default Ranking" des betreffenden Moduls.
Nehmen wir an,
'News' => array( 1,4, 'funcSucheMod_News' ),
'Rezept' => array( 1,5, 'funcSucheMod_Rezept' ),
Im obigen Beispiel würde jeder Treffer im News Modul zunächst das Ranking 4 und ein Treffer im Rezeptmodul das Ranking 5 erhalten.
- Nehmen wir an wir landen also einen Treffer in der Rezepttabelle, dann erhält der Link zunmächst das Ranking 5.
Dann wird der Inhalt des Treffers untersuccht, hierzu steht in der Config:
/*
The following value will be added to a search engine results ranking if the COMPLETE query matches
*/
define('_SUCHE_RANKING_COMPLETE_QUERY_', 6.55);

/*
+ranking for title match
*/
define('_SUCHE_RANKING_TITLE_MATCH_', 1.8);

/*
+ranking for text match
*/
define('_SUCHE_RANKING_TEXT_MATCH_', 1);

Bdeutet jeweils:
_SUCHE_RANKING_COMPLETE_QUERY_: Wenn der GESAMTE Suchbegriff geunden wurde (konträr zu nur einem Wort des Suchqueries) werden zum Ranking _SUCHE_RANKING_TEXT_MATCH_ Punkte hinzuaddiert.
_SUCHE_RANKING_TITLE_MATCH_: Nehmen wir an das Suchwort kommt 2x im Titel vor, dann wird
2 * _SUCHE_RANKING_TITLE_MATCH_zum Ranking hiunzuaddiet.
_SUCHE_RANKING_TEXT_MATCH_: Nehmen wir an das Suchwort kommt Xmal im Text vor,dann wird
X * _SUCHE_RANKING_TEXT_MATCH_ zum Ranking hinzuaddiert.

Außerdem gilt zu beachten:

Das Suchergebniss wird _SUCHE_CACHE_EXPIRE_Sekunden lang gecached, daß heißt, Du mußt _SUCHE_CACHE_EXPIRE_ Sekunden warten um eine Veränderung zu sehen, wenn Du nach dem gleichen Suchquery suchst.

:bye:

EDIT: Ich hab den Unteschied jetz gesehen (oben )  :red:
NAtürlich muß zuerst eine 1 da stehen!