phpbar.de logo

Mailinglisten-Archive

Suche-Layout

Suche-Layout

Technik via echtwahr.com - Neuer Server technik at echtwahr.com
Sam Aug 27 23:23:35 CEST 2005


Hallo,

ich bin gerade dabei eine Datenbank für eine Suche zu erstellen,
bin auch ganz zufrieden damit, wollte aber mal hören ob ich da noch was
verbessern kann.

Ich habe folgendes gemacht.

1 Tabelle für die Titel, wobei jedes Wort nur einmal gespeichert ist und die
dazu gehörigen Artikel in der Tabelle aus `ref` liegen.

CREATE TABLE `word_list_title` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `word` char(20) default NULL,
  `ref` char(14) default NULL,
  `lastchange` timestamp ... on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `word` (`word`)
 ...
15330 unterschiedliche Wörter.
 id | word        | ref           | lastchange          |
  2 | latex       | suche.ref_t_l | 2005-08-26 09:56:40 |
  3 | schwarz     | suche.ref_t_s | 2005-08-26 09:56:40 |
  4 | mama        | suche.ref_t_m | 2005-08-26 09:56:40 |

Die selbe Tabelle für die Inhalte.

CREATE TABLE `word_list_desc` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `word` char(20) default NULL,
  `ref` char(14) default NULL,
  `lastchange` timestamp ... on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `word` (`word`)
...
37077 unterschiedliche Wörter.



Jetzt hab ich für `word_list_title`.`ref` jeweil eine tabelle, die sich aber
immer auf den anfangsbuchstaben bezieht. Also 27 Tabelle die alle
folgendermaßen aussehen:
CREATE TABLE `ref_t_a` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `word_id` int(10) unsigned NOT NULL default '0',
  `item_id` int(10) unsigned NOT NULL default '0',
  `lastchange` timestamp ... on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `word_id` (`word_id`),
  KEY `item_id` (`item_id`)

 Dasselbe auch noch mal für `word_list_desc`.`ref`, auch 27 Tabellen.

Insgesamt sind es 538 MB an Daten.
Jetzt hab ich mir ein Programm geschrieben das mir Suchanfragen simuliert.

Ich hab mir das folgendermaßen überlegt,
erst suche ich mir die `ref` tabelle zu jedem wort wobei im Titel und Inhalt
gesucht werden soll:

select SQL_CALC_FOUND_ROWS `id`, `ref` from `word_list_title` as T where
T.word  in ( 'latex'  ,'schwarz'  ,'mama' )
union select `id`, `ref` from `word_list_desc` as D where  D.word  in (
'latex'  ,'schwarz'  ,'mama' )

Aus der Ergebnisliste suche ich mir dann alle item_id raus, je nachdem ob
die Suchanfrage eine OR oder AND ist, leider hab ich noch keine Idee wie ich
das ganze folgendermaßen verknüpfen kann: latex AND schwarz OR mama (ist
aber nicht so wichtig jetzt)

Bei einer OR abfragen gehen ich so vor:
create table if not exists `temp_00001` (item_id int not null primary key)
select SQL_CALC_FOUND_ROWS item_id from suche.ref_t_l as t where word_id = 2
union DISTINCT  select item_id from suche.ref_t_m where word_id = 4
union DISTINCT  select item_id from suche.ref_t_s where word_id = 3
union DISTINCT  select item_id from suche.ref_d_l where word_id = 168
union DISTINCT  select item_id from suche.ref_d_m where word_id = 5583
union DISTINCT  select item_id from suche.ref_d_s where word_id = 238  group
by item_id

und bei einer AND abfragen
create table if not exists `temp_00001` (item_id int not null primary key)
select SQL_CALC_FOUND_ROWS t.item_id from suche.ref_t_l AS t  INNER JOIN
suche.ref_t_m AS t1 ON (t1.word_id = 4 AND t.item_id = t1.item_id )  INNER
JOIN suche.ref_t_s AS t2 ON (t2.word_id = 3 AND t1.item_id = t2.item_id )
INNER JOIN suche.ref_d_l AS t3 ON (t3.word_id = 168 AND t2.item_id =
t3.item_id )  INNER JOIN suche.ref_d_m AS t4 ON (t4.word_id = 5583 AND
t3.item_id = t4.item_id )  INNER JOIN suche.ref_d_s AS t5 ON (t5.word_id =
238 AND t4.item_id = t5.item_id )  where t.word_id = 2  and t1.word_id = 4
and t1.item_id IS NOT NULL and t2.word_id = 3 and t2.item_id IS NOT NULL and
t3.word_id = 168 and t3.item_id IS NOT NULL and t4.word_id = 5583 and
t4.item_id IS NOT NULL and t5.word_id = 238 and t5.item_id IS NOT NULL group
by t.item_id


Der Grund warum ich das mache ist, das die FULLTEXT Engine nicht wirklich
schnell ist, wenn man in einem Index Sucht der über 200.000 Einträge hat,
die dann auch länger als AVG=1194 Zeichen sind.

Wenn ich mit meinen Überlegungen völlig auf dem Holzweg bin, na ja, gute
Ideen sind wirklich immer willkommen.

Ciao Thomas



-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive