La conversión introducido por el usuario en la consulta de búsqueda a la cláusula where para su uso en SQL Server búsqueda de texto completo

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

Pregunta

¿Cuál es la mejor manera de convertir los términos de búsqueda introducidos por el usuario, en una consulta que puede ser utilizado en una cláusula where para la búsqueda de texto completo para consultar una tabla y obtener resultados relevantes?Por ejemplo, la siguiente consulta introducida por el usuario:

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

Debe traducirse en algo así como:

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

Estoy usando un consulta analizador de clase en el momento en el que analiza la consulta introducida por los usuarios de símbolos usando una expresión regular, y luego construye la cláusula where de los testigos.

Sin embargo, dado que este es, probablemente, un requisito común por una gran cantidad de sistemas mediante la búsqueda de texto completo, soy curioso en cuanto a cómo otros desarrolladores han abordado este problema, y si hay una mejor manera de hacer las cosas.

¿Fue útil?

Solución

Esto puede no ser exactamente lo que está buscando, pero que le puede ofrecer algunas ideas adicionales.

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

Otros consejos

¿Cómo poner en práctica la respuesta aceptada utilizando .Net / C # / Entity Framework ...

  1. Instalar Ironía usando Nuget.

  2. Agregue la clase de muestra a partir de: http://irony.codeplex.com/SourceControl/latest#Irony .Samples / FullTextSearchQueryConverter / SearchGrammar.cs

  3. Escribir código como este para convertir la cadena introducida por el usuario a una 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. Tal vez escribir un procedimiento almacenado de esta manera:

    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. Ejecutar la consulta.

    var fishes = db.SearchLivingFish(query);
    

Además de la respuesta de @ franzo anterior es probable que también quiere cambiar el comportamiento de palabras vacías por defecto en SQL. De lo contrario, las consultas que contienen números de un solo dígito (u otras palabras vacías) no arrojó ningún resultado.

Cualquiera de las palabras vacías desactivar, crear su propia lista de palabras de parada y / o palabras de ruido establecidos para ser transformado como se explica en SQL 2008: Apagar las palabras vacías de búsqueda de texto de consulta

Para ver la lista de sistemas de palabras (Inglés) detener SQL, ejecute:

select * from sys.fulltext_system_stopwords where language_id = 1033

Me doy cuenta de que es un poco de un lado a paso de su pregunta original, pero ¿ha considerado alejándose de índices de texto completo de SQL y usar algo como Lucene / Solr lugar?

La forma más sencilla de hacerlo es utilizar SQL dinámico (lo sé, inserte cuestiones de seguridad aquí) y romper la frase en una cadena con el formato correcto.

Puede utilizar una función para romper la frase en una variable de tabla que puede utilizar para crear la nueva cadena.

Una combinación de GoldParser y Calitha debería ayudará con estas cosas aquí.

En este artículo: http://www.15seconds.com/issue/070719.htm tiene una clase googleToSql, así, que hace parte de la traducción para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top