Sie können das Problem der mysql-REPLACE()
-Funktion mit LOWER()
umgehen.
Es ist schlampig, aber an meinem Ende läuft diese Abfrage ziemlich schnell.
Um Dinge schneller zu machen, erhalte ich die Ergebnismenge in einer Auswahl, die ich in meiner 'äußeren' Abfrage als abgeleitete Tabelle deklariert habe. Da mysql zu diesem Zeitpunkt bereits die Ergebnisse liefert, funktioniert die Methode replace ziemlich schnell.
Ich habe eine Abfrage ähnlich der folgenden erstellt, um nach mehreren Begriffen in mehreren Tabellen und mehreren Spalten zu suchen.Ich erhalte eine ‚Relevanz‘ Zahl entspricht die Summe der Anzahl aller occurrances aller gefundenen Suchbegriffe in allen Spalten
SELECT DISTINCT (
((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('there'),'')))/length('there'))
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('there'),'')))/length('there'))
+ ((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('another'),'')))/length('another'))
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('another'),'')))/length('another'))
) as relevance,
x.ent_type,
x.ent_id,
x.this_id as anchor,
page.page_name
FROM (
(SELECT
'Foo' as ent_type,
sp.sp_id as ent_id,
sp.page_id as this_id,
sp.title as ent_title,
sp.content as ent_content,
sp.page_id as page_id
FROM sp
WHERE (sp.title LIKE '%there%' OR sp.content LIKE '%there%' OR sp.title LIKE '%another%' OR sp.content LIKE '%another%') AND (sp_content.title NOT LIKE '%goes%' AND sp_content.content NOT LIKE '%goes%')
) UNION (
[search a different table here.....]
)
) as x
JOIN page ON page.page_id = x.page_id
WHERE page.rstatus = 'ACTIVE'
ORDER BY relevance DESC, ent_title;
Hoffnung gesucht, das hilft jemand
- Seacrest aus
, wie viele Zeilen den Suchtext enthalten. Der Fragesteller möchte zählen, wie oft der Suchstring in jeder Zeile enthalten ist. – flu