Hejsan! lagrade procedurer kanske.... Jo det har jag... jag tänkte snarare på självaste SQL-satsen... Kör du med SQL server som databas? Ska man få resultatet med posten dagen efter eller? ;) Skrivit ett MS SQL Server sexempel:är detta den ultimata SQL-satsen?
Jag har en, enligt mig, ganska avancerad SQL-sats. Den blir dock ganska lång och tar lång tid att köra. GÅR det att snabba upp den eller är det omöjligt?
Så här fungerar den: Användaren söker på ett eller flera ord (i detta fall "romeo och julia"), söken letar då först upp alla artiklar som har söksträngen i titeln, sedan de artiklar som har söksträngen i texten, sedan de artiklar som har alla orden i söksträngen i texten och sist alla artiklar som har något av orden i texten.
Här kommer exemplet:
'''Söksträngen i titeln
SELECT ar.aID ,'100%' as relevans FROM texter AS ar, forfattare AS fr WHERE fr.fID = ar.fID AND ar.titel LIKE '%romeo och julia%'
'''Söksträngen i texten
UNION ALL
SELECT ar.aID ,'75%' as relevans FROM texter AS ar, forfattare AS fr WHERE fr.fID = ar.fID AND texten LIKE '%romeo och julia%' AND ar.titel NOT LIKE '%romeo och julia%'
'''Alla ord i söksträngen i texten
UNION ALL
SELECT ar.aID ,'50%' as relevans FROM texter AS ar, forfattare AS fr WHERE fr.fID = ar.fID AND ar.titel NOT LIKE '%romeo och julia%' AND (texten LIKE '%romeo%' AND texten LIKE '%och%' AND texten LIKE '%julia%') AND aid NOT IN (SELECT ar.aID WHERE fr.fID = ar.fID AND texten LIKE '%romeo och julia%')
'''Något av orden i söksträngen i texten
UNION ALL
SELECT ar.aID ,'25%' as relevans FROM texter AS ar, forfattare AS fr WHERE fr.fID = ar.fID AND ar.titel NOT LIKE '%romeo och julia%' AND (texten LIKE '%romeo%' OR texten LIKE '%och%' OR texten LIKE '%julia%') AND aid NOT IN (SELECT ar.aID WHERE fr.fID = ar.fID AND texten LIKE '%romeo och julia%')
Jag vet inte, den borde ju gå att optimera lite bättre... detta är väl ett bra sätt att göra en relevanssökning eller vad säger ni databasexperter???
TACK*1000 för all hjälp!!!Sv: är detta den ultimata SQL-satsen?
kolla i tips & trixx
// JompaSv: är detta den ultimata SQL-satsen?
Sv: är detta den ultimata SQL-satsen?
Har inte SQL server tillgänligt. Så jag skrev frågan i access:
SELECT texter.aID, (texter.titel Like '*romeo och julia*') AS [Full Titel], ((texter.titel Like '*romeo*')+(texter.titel Like '*och*')+(texter.titel Like '*julia*'))*-1 AS [Count Titel], (texter.texten Like '*romeo och julia*') AS [Full Texten], ((texter.texten Like '*romeo*')+(texter.texten Like '*och*')+(texter.texten Like '*julia*'))*-1 AS [Count Texten]
FROM texter
WHERE (((texter.titel) Like '*romeo*' Or (texter.titel) Like '*och*' Or (texter.titel) Like '*julia*' OR (texter.texten) Like '*romeo*' Or (texter.texten) Like '*och*' Or (texter.texten) Like '*julia*'));
Visar hur du får all information med en fråga. Skapa sedan en temporärtabell så kan du sortera resultate och namnge det med procent.Sv: är detta den ultimata SQL-satsen?
Nej, men allvarligt, den här frågan kommer att ta oändligt lång tid att exekvera. Pröva lägg in lite rader i din databas (det räcker nog t o m med ett par tusen) med lite långa fina texter och se hur lång tid den tar. Skadu göra sökningar på ord och fraser i texter (dvs fritextsökningar) så måste du nästan utnyttja någon annan teknik än bara SQL. Var det SQL Server du körde? Titta isf på Full-Text Search.Sv: är detta den ultimata SQL-satsen?
<code>
CREATE TABLE #Result (aID int, [Titel Match] bit, [Titel Words] int, [Texten Match] bit, [Texten Words] int)
INSERT INTO #Result SELECT texter.aID,
CASE WHEN texter.titel LIKE '%romeo och julia%' THEN 1 ELSE 0 END AS [Titel Match],
CASE WHEN texter.titel LIKE '%romeo%' THEN 1 ELSE 0 END +
CASE WHEN texter.titel LIKE '%och%' THEN 1 ELSE 0 END +
CASE WHEN texter.titel LIKE '%julia%' THEN 1 ELSE 0 END AS [Titel Words],
CASE WHEN texter.texten LIKE '%romeo och julia%' THEN 1 ELSE 0 END AS [Texten Match],
CASE WHEN texter.texten LIKE '%romeo%' THEN 1 ELSE 0 END +
CASE WHEN texter.texten LIKE '%och%' THEN 1 ELSE 0 END +
CASE WHEN texter.texten LIKE '%julia%' THEN 1 ELSE 0 END AS [Texten Words]
FROM texter
WHERE texter.titel LIKE '%romeo%' OR
texter.titel LIKE '%och%' OR
texter.titel LIKE '%julia%' OR
texter.texten LIKE '%romeo%' OR
texter.texten LIKE '%och%' OR
texter.texten LIKE '%julia%'
SELECT #Result.aID,
CASE [Titel Match]
WHEN 1 THEN '100%'
ELSE
CASE [Texten Match]
WHEN 1 THEN '75%'
ELSE
CASE [Titel Words]
WHEN 3 THEN '50%'
WHEN 0 Then
CASE [Texten Words]
WHEN 3 THEN '45%'
WHEN 0 Then '0%'
ELSE '15%'
END
ELSE
CASE [Texten Words]
WHEN 3 THEN '45%'
ELSE '25%'
END
END
END
END
AS Relevans
FROM #Result
ORDER BY [Titel Match] DESC, [Texten Match] DESC, [Titel Words] DESC, [Texten Words] DESC
DROP TABLE #Result
</code>
Hoss mig tar det 24 sedkunder att hämta 20480 av 32768 poster. Stor skillnaden är att den bara behöver göra en sökning av tabellen och inga joins eller underfråger.