Pergunta

Eu estou construindo um C # / aplicativo ASP.NET com um backend SQL. Estou no fim do prazo e terminando minhas páginas, fora de um campo esquerdo das minhas estilistas incorporadas uma pesquisa de texto completo em uma das minhas páginas. Minhas "pesquisas" Até este ponto ter sido filtros, sendo capaz de diminuir um conjunto de resultados por certos fatores e valores da coluna.

Sendo que eu estou no prazo (você sabe 3 horas de sono por noite, no ponto onde eu estou olhando como algo que o gato comeu e vomitou), eu estava esperando esta página para ser muito semelhante ao ser outros e I estou tentando decidir se quer ou não fazer um fedor. Eu nunca fiz uma pesquisa de texto completo em uma página antes .... isto é uma montanha para escalar ou há uma solução simples?

obrigado.

Foi útil?

Solução

Primeiro, você precisa habilitado texto completo Buscando indexação nos servidores de produção, por isso, se isso não é no escopo, o seu não vai querer ir com isso.

No entanto, se já está pronto para ir, pesquisa de texto completo é relativamente simples.

T-SQL tem 4 predicados usados ??para pesquisa de texto completo:

  • FREETEXT
  • FREETEXTTABLE
  • contém
  • CONTAINSTABLE

FREETEXT é o mais simples e pode ser feito assim:

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

Results:

JimBob
Little Bobby Tables

FREETEXTTABLE funciona da mesma forma freetext, exceto que ele retorna os resultados como uma tabela.

O verdadeiro poder da pesquisa de texto completo de T-SQL vem do CONTÉM (e CONTAINSTABLE) predicado ... Este é enorme, por isso vou colar o seu uso em:

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 ] 
        ) 

Isto significa que você pode escrever consultas, tais como:

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

Results:

Little Bobby Tables

Boa sorte:)

Outras dicas

pesquisa completa de texto no SQL Server é realmente fácil, um pouco de configuração e um ligeiro ajuste na queryside e você é bom para ir! Tenho feito isso para os clientes em menos de 20 minutos antes, estar familiarizado com o processo

Aqui está a 2008 Artigo MSDN , links sair para as 2005 versões de lá

Eu tenho usado dtSearch antes para adicionar pesquisa de texto completo para arquivos e bancos de dados, e seu material é muito barato e fácil de usar.

curta de adicionar tudo isso e configurar SQL, este script irá procurar através de todas as colunas em um banco de dados e dizer o que colunas contêm os valores que você está procurando. Eu sei que não é a solução "correta", mas pode comprar algum tempo.

/*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'

Eu estive lá. Ele funciona como um encanto até que você começar a considerar escalabilidade e pesquisa avançada funcionalidades como pesquisa sobre várias colunas com dando a cada um valores de peso diferentes.

Por exemplo, a única maneira de pesquisar mais de Título e Resumo colunas é ter uma coluna calculada com SearchColumn = CONCAT(Title, Summary) e índice sobre SearchColumn. Ponderação? SearchColumn = CONCAT(CONCAT(Title,Title), Summary) algo parecido. ;) Filtragem? Esquecê-la.

"Como é que é difícil" é uma pergunta difícil de responder. Por exemplo, alguém que já fez isso 10 vezes, provavelmente, acho que é um piscar de olhos. Tudo que eu posso dizer é que é provável que você achar que é muito mais fácil se você usar algo como NLucene em vez de rolar seus próprios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top