mysql-volltextsuche
jenslm
- php
0 Vinzenz Mai0 jenslm0 Vinzenz Mai0 jenslm
Hallo,
hab folgendes Problem:
Ich möchte eine Volltextsuche haben. Das ganze soll auch mit möglichst vielen Datensätzen noch reibungslos funktionieren. Um nun die Wörter meiner Artikel zu indizieren habe ich folgendes versucht:
//Artikel abfragen
$sql = "SELECT a.id AS aid, b.id, 'article' AS type,
CONCAT(a.title, ' ', a.text, ' ', a.category) AS search_data
FROM article AS a
LEFT JOIN search_time AS b
ON b.aid = a.id
AND FIND_IN_SET('article', b.type)
WHERE FIND_IN_SET('1', a.indexing)
AND (b.id IS NULL OR a.date > b.date)
ORDER BY a.date";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
Die Tabellen dazu:
article
id | date | indexing | title | text | category
----------------------------------------------
/\
gibt an ob der Artikel indiziert werden soll oder nicht mit Hilfe von 0 und 1!
search_time:
id | type | aid | date
----------------------
/\
Artikel-id
Die Abfrage funktioniert soweit!
Dann möchte ich Stoppwörter einlesen. Das ganze hab ich so realisiert:
function getStopwords()
{
include("".$_SERVER['DOCUMENT_ROOT']."/ordner/stopwords-de.php");
}
in der inkludierten datei steht:
$stopwords[] = "aber";
$stopwords[] = "alle";
//usw.
Das sollte auch nicht das Problem sein.
Nun sollen die Suchergebnisse (search_data) noch angepasst werden und zwar so:
function extractWords($search_data)
{
$search = array();
$search[] = "sonderzeichen";
$replace = array();
$replace[] = "alternative";
$search_data = trim(strtolower(stripslashes(strip_tags($search_data))));
//Entfernt Backslashes, Leerzeichen etc.
$search_data = preg_replace($search, $replace, $search_data);
//Ersetzt die Sonderzeichen des Arrays "search" mit den Alternativen des Arrays "replace"
$search = array();
$search[] = "=(\s[A-Za-z]{1,2})\s=";
$search[] = "= " . implode(" | ", getStopwords()) . " =i"; //soll stoppwörter entfernen...
$search[] = "= +=";
$replace = array();
$replace[] = " ";
$replace[] = " ";
$replace[] = " ";
$search_data = " ".str_replace(" ", " ", $search_data)." ";
$search_data = trim(preg_replace($search, $replace, $search_data));
}
...leider funktioniert das mit den Stoppwörtern so nicht. Wir könnte ich die da einbinden?!
Und wie kann ich dann die Suchergebnisse ausgeben?
Lg, Jens
Hallo Jens,
Ich möchte eine Volltextsuche haben.
nutze einfach die Volltextsuche von MySQL.
Freundliche Grüße
Vinzenz
hab gehört, dass es besser ist, wenn man eigene Indextabellen erstellt?
Es werden auch ziemlich viele Datensätze durchsucht werden!!!
Lg, Jens
Hallo Jens,
hab gehört, dass es besser ist, wenn man eigene Indextabellen erstellt?
Es werden auch ziemlich viele Datensätze durchsucht werden!!!
genau für solche Zwecke ist die integrierte Volltextsuche gedacht und optimiert.
Mit Sicherheit schneller und effizienter als eine eigene Lösung, die nur den Server zumüllt. Es ist in den allerseltensten Fällen eine gute Idee, vorhandene Funktionalität in einer interpretierten Skriptsprache nachzubauen.
Freundliche Grüße
Vinzenz
hallo,
hab dann mal die Mysql-Volltextsuche verwendet.
Kann ich es auch irgendwie anders realisieren, dass auch Wörter mit 3 Buchstaben gesucht werden, anstatt die Optionsdatei zu bearbeiten?!
Hab ich das richtig verstanden? Mit "IN BOOLEAN MODE" wird automatisch die Stoppwortliste verwendet? Die wird dann höchstwahrscheinlich Englisch sein?! Wie verhält sich dass dann mit deutschen Suchbegriffen?!
Lg, Jens