Suche mit angabe der Relevanz

10/10/2007 - 16:06 von Christoph Franzen | Report spam
Hallo,

ich möchte in einer Tabelle nach etwas suchen. Dabei gibt es drei Felder in
denen der Begriff vorkommen kann. (Headline, Kurz und Inhalt) Kurz ist dabei
eine Kurzbeschreibung.

Ich möchte die Ergebnisse gerne nach Relevanz sortieren. Ich habe es einfach
mal mit diesem Code probiert:

SELECT headline,seiteID,kurz,sorted0 FROM navigation,seite where
navigation.v_webID=3 AND n1=-10 AND v_navID=navID AND headline like
'%busine%'
UNION
SELECT headline,seiteID,kurz,sortedP FROM navigation,seite where
navigation.v_webID=3 AND n1=-10 AND v_navID=navID AND kurz like '%busine%'
UNION
SELECT headline,seiteID,kurz,sorted FROM navigation,seite where
navigation.v_webID=3 AND n1=-10 AND v_navID=navID AND inhalt like '%busine%'

Als Suchbegriff habe ich hier busine benutzt.

Mein Problem ist, dass ein Text, der "Busine" in der Headline und in der
Kurzbeschreibung enthàlt, auch zweimal angegeben wird, da der Wert für
sorted unterschiedlich ist.

Wie kann ich das verhindern, so daß ich jeden Text nur 1x zurückgeliefert
bekomme?

Gibt es vielleicht auch eine Möglichkeit, die Werte aufzuaddieren? Ich meine
damit, dass die sorted-Werte für alle drei möglichen Fundstellen
zusammengefasst werden?

Danke.
 

Lesen sie die antworten

#1 Olaf Pietsch
10/10/2007 - 19:54 | Warnen spam
Hallo Christoph,

"Christoph Franzen" schrieb
im Newsbeitrag news:%

ich möchte in einer Tabelle nach etwas suchen. Dabei gibt es drei Felder
in denen der Begriff vorkommen kann. (Headline, Kurz und Inhalt) Kurz ist
dabei eine Kurzbeschreibung.

Ich möchte die Ergebnisse gerne nach Relevanz sortieren. Ich habe es
einfach mal mit diesem Code probiert:

SELECT headline,seiteID,kurz,sorted0 FROM navigation,seite where
navigation.v_webID=3 AND n1=-10 AND v_navID=navID AND headline like
'%busine%'
UNION
SELECT headline,seiteID,kurz,sortedP FROM navigation,seite where


...

Man könnte sich für den Primàrschlüssel der Seiten (seiteID) eine temp
Tabelle oder TABLE Variable definieren.
Dann könnte man in den einzelne Selects die ID in die Tabelle einspeichen
und auf not exists () prüfen.
Zum Schluß wird anhand des Zwischenergebnisse das Endergebnis selektiert.


CREATE TABLE #t (seiteID int);
INSERT INTO #t
SELECT seiteID FROM navigation,seite where
navigation.v_webID=3 AND n1=-10 AND v_navID=navID AND headline like
'%busine%';

INSERT INTO #t
SELECT seiteID FROM ... seite AS x
where
... kurz like '%busine%'
AND
NOT EXISTS (SELECT * FROM #t AS t WHERE t.seiteID = x.seiteID )

usw.

Dann das Endergebnis mittels JOIN auf #t erstellen.

Bitte bedenke, dass bei der Art zu Suchen (like '%busine%') das System in
der Regel sequentiell die Daten durchsuchen muss. Das wird höchst
wahrscheinlich bei größeren Datenmengen zu langen Antwortzeiten führen.

Ich würde einmal schauen, ob für Deine Suchanfragen die Volltextsuche nicht
besser geeignet ist, da dabei auch eine Ranking ermittelt werden kann.

"Die von CONTAINSTABLE erstellte Tabelle enthàlt eine Spalte namens RANK.
Die RANK-Spalte enthàlt für jede Zeile einen Wert (von 0 bis 1000), der
angibt, wie gut eine Zeile mit dem Auswahlkriterium übereinstimmt."

aus CONTAINSTABLE (Transact-SQL)
http://msdn2.microsoft.com/de-de/li...89760.aspx


Gruß Olaf
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Regionalgruppe Köln/Bonn/Düsseldorf
(http://www.sqlpass.de/Regionalgrupp...fault.aspx)

Ähnliche fragen