2011-01-05 4 views
3

Ich spiele in der AdventureWorks Datenbank mit Volltextsuche. In der production.ProductDescription versuche ich nach "mountain" und "replacements" zu suchen.Ist es möglich, eine Flexions- und Umgebungssuche in einer einzigen CONTAINSTABLE-Suchbedingung zu kombinieren?

Ich weiß, es ist ein Rekord mit der folgenden Beschreibung:

High-performance mountain replacement wheel. 

Mein erstes gehen um, war dies:

SELECT 
    pd.Description, 
    ct.RANK 
FROM Production.ProductDescription AS pd 
    INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'mountain NEAR replacements' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY] 
ORDER BY ct.RANK DESC; 

Diese Zeilen 0 zurückgegeben. Wenn ich "Mountain NEAR Replacements" zu "Mountain NEAR Replacement" ändere, bekomme ich den Datensatz, den ich in dem resultierenden Datensatz erwarte.

Mein war nächsten Versuch, etwas wie folgt aus, um zu versuchen:

SELECT 
    pd.Description, 
    ct.RANK 
FROM Production.ProductDescription AS pd 
    INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY] 
ORDER BY ct.RANK DESC; 

aber dies erzeugt den Fehler

Syntax error near 'NEAR' in the full-text search condition 'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"'. 

ich an der Grammatik für CONTAINS einen Blick hatte und es stellt sich heraus, dass Sie habe keinen generation_term (zB FORMSOF()) und einen proximity-Term (zB NEAR) in der gleichen Suchbedingung.

Ich habe den folgenden Datensatz zur Tabelle:

Replacement parts for you omg gee-whiz mountain 

Das Rekordhoch (96) in der folgenden fts Abfrage zählt:

SELECT 
    pd.Description, 
    ct.RANK 
FROM Production.ProductDescription AS pd 
    INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL,"replacements") AND "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY]  
ORDER BY ct.RANK DESC; 

aber wie erwartet Ränge niedriger (32) in dieser query:

SELECT 
    pd.Description, 
    ct.RANK 
FROM Production.ProductDescription AS pd 
    INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    '"replacement" NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY] 
ORDER BY ct.RANK DESC; 

Für dieses erfundene Beispiel, würde ich einen Benutzer mag in der Lage sein, die Suche te zur Verfügung zu stellen RMS Berg und Ersatz und haben es Rekorde mit einem relativ hohen Rang für Datensätze, die Ersatz und Berg nahe beieinander enthalten, aber nicht zur Verfügung, wie man dorthin kommt.

Antwort

2

Der letzte Eintrag, den Sie fügte hinzu: „Ersatzteile für Sie omg gee-Senkrechtstarter Berg“

Das Wort Ersatz ist nicht wirklich in der Nähe von dem Wort Berg, weshalb das Ranking recht niedrig ist.

Im Adventureworks-Beispiel betrachten Sie Produktbeschreibungen, die wirklich kurze Felder sind und nicht wirklich, wofür der NEAR-Operator gedacht war. In diesem Fall

würde ich nur

'FORMSOF(INFLECTIONAL, "replacement") AND FORMSOF(INFLECTIONAL, "mountain")' 

oder eine varation davon mit Ihrem CONTAINS Beispiel.

Interessanterweise gibt Ihre Abfrage, die Sie sagten, Sie 96 Ranking, gibt mir nur eine 32-Rangliste. Ich verwende SQL Server 2005 zum Testen und ich habe den Volltextindex für Product.ProductDescription.Description mit den Standardeinstellungen eingerichtet.

Es ist schwer zu sagen, was genau zu einem höheren Ranking beiträgt hier geben, dass diese sehr ähnliche Einträge ziemlich unterschiedliche Rankings haben: Ersatz Mountainbike-Rad für Einsteiger. - 96 Ersatz-Mountainbike-Rad für den gelegentlichen bis ernsthaften Fahrer. - 48

Verwandte Themen