2008-09-15 14 views
5

¿Alguien ha encontrado una buena manera de realizar búsquedas de texto completo (FREETEXT() CONTAINS()) para cualquier cantidad de palabras clave arbitrarias utilizando la sintaxis estándar de la consulta LinqToSql?LinqToSql y búsqueda de texto completo: ¿se puede hacer?

Obviamente, me gustaría evitar tener que usar un Stored Proc o tener que generar una llamada de SQL dinámico.

Obviamente tan sólo pudiera bombear la cadena de búsqueda en el parámetro a un procedimiento almacenado que utiliza FREETEXT() o CONTIENE(), pero yo estaba esperando a ser más creativos con la búsqueda y construir consultas como:

"pizza de pepperoni" y hamburguesa, no "tarta de manzana".

Loco Lo sé, pero ¿no sería genial poder hacer esto directamente desde LinqToSql? Cualquier consejo sobre cómo lograr esto sería muy apreciado.

Actualización: Creo que puedo ser a algo here ...

También: Me di la vuelta el cambio realizado a título de la pregunta porque realmente cambió el significado de lo que estaba pidiendo. I sepa que la búsqueda de texto no es compatible con LinqToSql - Hubiera preguntado si quería saber eso. En su lugar, he actualizado mi título para apaciguar las masas edit-happy-trigger-fingers.

Respuesta

4

Desafortunadamente LINQ to SQL no es compatible con Full Text Search.

Hay un montón de productos que creo que podrían: Lucene.NET, NHibernate Search me viene a la mente. LINQ para NHibernate combinado con NHibernate Search probablemente le daría esa funcionalidad, pero ambos aún son muy profundos en beta.

+0

Hola Jon, gracias por esto. Estoy contento con su respuesta en principio y soy consciente de que podría agregar otra capa de abstracción. No es ideal aunque también escriba el CONTAINS() SPROC y use Linq para cada cosa más. Mi pregunta es "¿Se puede hacer utilizando Linq"? Si no, entonces tu respuesta será suficiente. – RobertTheGrey

+0

He decidido usar Lucene.NET para esto ahora y realmente funciona bastante bien. Ahora solo tengo que ejecutar Memcached y no necesitaré acceder al DB ;-) – RobertTheGrey

5

He arreglo para evitar esto mediante el uso de una función con valores de tabla para encapsular el componente de búsqueda de texto completo, a continuación, hace referencia dentro de mi expresión LINQ mantienen los beneficios de la ejecución retardada:

string q = query.Query; 
IQueryable<Story> stories = ActiveStories 
         .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o) 
         .Where (s => (query.CategoryIds.Contains(s.CategoryId)) && 
            /* time frame filter */ 
           (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) && 
           (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value))); 

Aquí 'tvf_SearchStories 'es la función de la tabla de valores que utiliza internamente búsqueda de texto completo

Cuestiones relacionadas