Frage

Ich baue eine C # / ASP.NET app mit einem SQL-Backend. Ich bin zu den Fristen und meine Seiten Finishing, aus der linken Feld eine meiner Designer integriert eine Volltextsuche auf einer meiner Seiten. Meine „Suchen“ bis zu diesem Punkt haben Filter gewesen, ein Ergebnis, das durch bestimmte Faktoren und Spaltenwerte gesetzt verengen zu können.

Sind, dass ich zu den Fristen bin (Sie wissen, 3 Stunden pro Nacht schlafen, an dem Punkt, wo ich wie etwas suche die Katze aß und warf nach oben), ich dieser Seite erwartet sehr ähnlich zu sein, andere und ich sein ist versucht, ob oder nicht zu entscheiden, einen Gestank zu machen. Ich habe noch nie eine Volltextsuche auf einer Seite getan .... dies ist ein Berg zu besteigen, oder gibt es eine einfache Lösung?

Danke.

War es hilfreich?

Lösung

Zunächst einmal müssen Sie die Volltextsuche Indizierung auf den Produktionsservern aktiviert ist, so, wenn das ist in ihrem Umfang nicht, Ihr nicht mit diesem gehen gehen zu wollen.

Wenn dies jedoch schon bereit ist zu gehen, Volltextsuche ist relativ einfach.

T-SQL verfügt über 4 Prädikate für Volltextsuche verwendet:

  • FREETEXT-
  • FREETEXTTABLE
  • ENTHÄLT
  • CONTAINS

FREETEXT- ist die einfachste und kann wie folgt geschehen:

SELECT UserName
FROM Tbl_Users
WHERE FREETEXT (UserName, 'bob' )

Results:

JimBob
Little Bobby Tables

FREETEXTTABLE funktioniert genauso wie FREETEXT-, außer es die Ergebnisse als Tabelle zurückgibt.

Die wahre Stärke von T-SQL der Volltextsuche stammt aus der ENTHÄLT (und CONTAINS) Prädikat ... Dieser ist riesig, so dass ich nur seine Verwendung einfügen in:

CONTAINS
    ( { column | * } , '< contains_search_condition >' 
    ) 

< contains_search_condition > ::= 
        { < simple_term > 
        | < prefix_term > 
        | < generation_term > 
        | < proximity_term > 
        | < weighted_term > 
        } 
        | { ( < contains_search_condition > ) 
        { AND | AND NOT | OR } < contains_search_condition > [ ...n ] 
        } 

< simple_term > ::= 
    word | " phrase "

< prefix term > ::= 
    { "word * " | "phrase * " }

< generation_term > ::= 
    FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] ) 

< proximity_term > ::= 
    { < simple_term > | < prefix_term > } 
    { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 

< weighted_term > ::= 
    ISABOUT 
        ( { { 
                < simple_term > 
                | < prefix_term > 
                | < generation_term > 
                | < proximity_term > 
                } 
            [ WEIGHT ( weight_value ) ] 
            } [ ,...n ] 
        ) 

Dies bedeutet, dass Sie Anfragen wie schreiben:

SELECT UserName
FROM Tbl_Users
WHERE CONTAINS(UserName, '"little*" NEAR tables')

Results:

Little Bobby Tables

Viel Glück:)

Andere Tipps

Volltextsuche in SQL Server ist wirklich einfach, ein bisschen Konfiguration und eine leichte zwicken auf dem queryside und Sie sind gut zu gehen! Ich habe es für die Kunden gemacht, bevor sie in weniger als 20 Minuten, wobei mit dem Prozess vertraut

Hier ist der 2008 MSDN-Artikel , Links gehen zu die 2005-Versionen von dort

I dtSearch habe, bevor auf Dateien und Datenbanken der Suche nach Zugabe von Volltext verwendet, und ihre Sachen sind ziemlich billig und einfach zu bedienen.

Kurz all das, was das Hinzufügen und Konfigurieren von SQL, wird dieses Skript durch alle Spalten in einer Datenbank suchen und Ihnen sagt, welche Spalten die Werte enthalten, die Sie suchen. Ich weiß, es ist nicht die „richtige“ Lösung, aber können Sie einige Zeit kaufen.

/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/

SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%staff%' --should be formatted as a like search 
SET @objectOwner = 'dbo'

DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))

INSERT INTO @potentialcolumns (sql)
SELECT 
    ('if exists (select 1 from [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) where [' + 
    [cols].[column_name] + 
    '] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) WHERE [' + 
    [cols].[column_name] + 
    '] LIKE ''''' + @valuetosearchfor + '''''' +
    '''') as 'sql'
FROM information_schema.columns cols
    INNER JOIN information_schema.tables tabs
        ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
            AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
            AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
    AND tabs.table_schema = @objectOwner
    AND tabs.TABLE_TYPE = 'BASE TABLE'
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position

DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
    SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
    IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
    BEGIN
        --SELECT @sql --use when checking sql output
        EXEC (@sql)
    END
    SET @iterator = @iterator + 1
END

PRINT ''
PRINT 'Scan completed'

Ich bin dort gewesen. Es wirkt wie ein Zauber, bis Sie beginnen mit geben jeweils eine unterschiedliche Gewichtswerte Skalierbarkeit und erweiterte Suchfunktionen wie die Suche über mehrere Spalten zu berücksichtigen.

Zum Beispiel ist die einzige Möglichkeit, über die Suche Titel und Zusammenfassung Spalten sind eine berechnete Spalte mit SearchColumn = CONCAT(Title, Summary) und Index über SearchColumn haben. Gewichtung? SearchColumn = CONCAT(CONCAT(Title,Title), Summary), dass so etwas. ;) Filter? Vergessen Sie es.

„Wie schwer ist es,“ ist eine schwierige Frage zu beantworten. Zum Beispiel, jemand, der es bereits getan hat 10-mal wird wahrscheinlich rechnet es ein Kinderspiel ist. Alles, was ich wirklich sagen kann, ist, dass Sie viel leichter zu finden sind wahrscheinlich, wenn Sie so etwas wie NLucene statt rollen Sie Ihre eigenen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top