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

Responder a