Convertendo consulta de pesquisa digitada pelo usuário para onde cláusula para uso em SQL Server pesquisa de texto completo

StackOverflow https://stackoverflow.com/questions/506034

Pergunta

Qual é a melhor maneira de termos de pesquisa converter inseridos por um usuário, em uma consulta que pode ser usado em uma cláusula onde para pesquisa de texto completo para consultar uma tabela e voltar resultados relevantes? Por exemplo, a seguinte consulta digitada pelo usuário:

+"e-mail" +attachment -"word document" -"e-learning"

deve se traduzir em algo como:

SELECT * FROM MyTable WHERE (CONTAINS(*, '"e-mail"')) AND (CONTAINS(*, '"attachment"')) AND (NOT CONTAINS(*, '"word document"')) AND (NOT CONTAINS(*, '"e-learning"'))

Eu estou usando um consulta analisador classe no momento, que analisa a consulta entrou pelos usuários em tokens usando uma expressão regular, e então constrói a cláusula de onde os tokens.

No entanto, dado que este é provavelmente um requisito comum por um monte de sistemas usando pesquisa de texto completo, estou curioso para saber como os outros desenvolvedores têm abordado este problema, e se há uma maneira melhor de fazer as coisas.

Foi útil?

Solução

Esta pode não ser exatamente o que você está procurando, mas ele pode oferecer-lhe mais algumas ideias.

http://www.sqlservercentral.com/articles/ de texto completo + Pesquisa + (2008) / 64248 /

Outras dicas

Como implementar a resposta aceita utilizando .Net / C # / Entity Framework ...

  1. Instale Ironia usando NuGet.

  2. Adicionar a classe de exemplo de: http://irony.codeplex.com/SourceControl/latest#Irony .Samples / FullTextSearchQueryConverter / SearchGrammar.cs

  3. Escrever código como este para converter a string digitada pelo usuário para uma consulta.

    var grammar = new Irony.Samples.FullTextSearch.SearchGrammar();
    var parser = new Irony.Parsing.Parser(grammar);
    var parseTree = parser.Parse(userEnteredSearchString);
    string query = Irony.Samples.FullTextSearch.SearchGrammar.ConvertQuery(parseTree.Root);
    
  4. Talvez escrever um procedimento armazenado como esta:

    create procedure [dbo].[SearchLivingFish]
    
    @Query nvarchar(2000)
    
    as
    
    select *
    from Fish
    inner join containstable(Fish, *, @Query, 100) as ft
    on ft.[Key] = FishId
    where IsLiving = 1
    order by rank desc
    
  5. Executar a consulta.

    var fishes = db.SearchLivingFish(query);
    

Além de resposta da @ Franzo acima, você provavelmente também quer alterar o comportamento de palavras de paragem padrão no SQL. Caso contrário consulta contendo números de um dígito (ou outras palavras de parada) não retornará nenhum resultado.

Desabilite palavras de parada, criar sua própria lista de palavras de paragem e / ou conjunto de palavras de ruído para ser transformado conforme explicado em SQL 2008: desativar a parada palavras para pesquisa de texto completo da consulta

Para ver a lista do sistema de (inglês) palavras sql parada, execute:

select * from sys.fulltext_system_stopwords where language_id = 1033

Sei que é um pouco de um lado a etapa da sua pergunta original, mas você já pensou se afastando de SQL texto completo índices e usando algo como Lucene / Solr vez?

A maneira mais fácil de fazer isso é usar SQL dinâmico (eu sei, as questões de segurança da inserção aqui) e quebrar a frase em uma string formatada corretamente.

Você pode usar uma função de quebrar a frase em uma variável de tabela que você pode usar para criar a nova cadeia.

A combinação de GoldParser e Calitha deve classificar-lo aqui.

Este artigo: http://www.15seconds.com/issue/070719.htm tem uma classe googleToSql bem, que faz parte da tradução para você.

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