Gracias Diego, Como decis, creo que estoy a un paso y quisiera evitar agregar un nuevo componente. Carlos Peix
_____ De: [email protected] [mailto:[email protected]] En nombre de Diego Jancic Enviado el: Viernes, 09 de Enero de 2009 12:42 a.m. Para: [email protected] Asunto: [dbms] Query full text search y XML [Privado] Carlos, Veo que ya tenés casi todo hecho, pero simplemente como recordatorio rápido: existe Lucene.NET 1 -Es .NET, no un SQL moderno y raro ;) 2- vos controlas realmente los índices y las búsquedas 3- tenes el concepto de Document (que podría ser uno por registro de SQL) y Fields, en donde podes subdividir los documentos para poder filtrar por algo especifico (como el site: o el filetype: de google) 4- si vas a mostrar los datos tipo Google, tenes un Contrib muy bueno para encontrar los fragmentos mas relevantes de cada documento, sugerir correcciones, etc.. Saludos!, Diego From: [email protected] [mailto:[email protected]] On Behalf Of Carlos Peix Sent: Wednesday, January 07, 2009 16:19 To: Diego Jancic Subject: [dbms] Query full text search y XML Hola gente, Tengo una tabla con una columna de tipo XML, mas o menos asi (pseudo DDL): CREATE TABLE DatosXML id int, datos xml Tambien tengo un full text index sobre la columna datos. A partir de esto tengo posibilidad de hacer el siguiente query: SELECT * FROM DatosXML WHERE CONTAINS(datos, 'Jose') Eso funciona bien pero me busca en todo el XML. El siguiente paso es extender la busqueda para encontrar registros que tengan un determinado string en un determinado nodo del XML. Llegue a esta consulta: SELECT * FROM DatosXML WHERE CONTAINS(datos, 'Jose') AND datos.exist('/Persona/Nombre/text()[fn:contains(.,"Jose")]') = 1 La idea es que el contains sobre el FTI filtre lo mas grueso de la consulta y luego, el fn:contains(), filtre mas especificamente. Eso tambien funciona, salvo que fn:contains() es case sensitive, por lo que no puedo usarlo realmente como un full text search. Googleando un poco mas encontre esta idea (siempre sobre el mismo DDL): SELECT * FROM DatosXML CROSS APPLY DatosXML.nodes('/Persona/Nombre/text()') nombre(tRef) WHERE CONTAINS(datos, 'Jose') AND nombre.tRef.value ('.', 'NVARCHAR(MAX)') LIKE '%jose%' La idea, segun entiendo, es sacar el nodo XML fuera y compararlo con un like, con lo cual tengo disponible una busqueda mas flexible. El problema de este query es que no funciona, da un error de sintaxis: Msg 493, Level 16, State 1, Line 1 The column 'tRef' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML datatype methods exist(), nodes(), query(), and value() or in IS NULL and IS NOT NULL checks. Dado que no entiendo bien lo que hace ese query ni como funciona el cross apply, no tengo idea de como sulucioanrlo. Alguien puede darme una mano? Gracias Carlos Peix
