Hola Mariano, Ya recorri este camino, al final del articulo que me pegaste aqui refiere a un articulo (http://msdn.microsoft.com/en-us/library/ms345117.aspx) el cual estuve leyendo tambien y, luego de recorrer varios articulos mas, llegue al query que postee y que parece adecuado, solo que no funciona. Ya tengo en al columna un indice XML primario y los tres secundarios, ademas del FTS. Tomando en cuenta que la tabla puede tener un millon de registros, vos crees que me alcanzara con los indices XML sin usar FTS o no? Yo entiendo que necesito la ayuda de un FTS, pero no estoy seguro. Carlos Peix
_____ De: [email protected] [mailto:[email protected]] En nombre de Jose Mariano Alvarez Enviado el: Miércoles, 07 de Enero de 2009 05:27 p.m. Para: [email protected] Asunto: [dbms] Query full text search y XML Un esquema asociado a una columna XML es basicamente un constraint. Si no tenes un esquema no va a poder eoptimizar el almacenamiento ahorrando espacio y mejorando los accesos. Sugiero que crees un indice por la columna XML y luego uno secundario seguramente por valor.. Luego hace la búsqueda XML Indexes in SQL Server 2005 http://msdn.microsoft.com/en-us/library/ms345121.aspx Te copio del manual [PRIMARY] XML Crea un índice XML en la columna xml especificada. Cuando se especifica PRIMARY, se crea un índice agrupado con la clave agrupada formada a partir de la clave de agrupación de la tabla de usuario y un identificador del nodo XML. Cada tabla puede tener hasta 249 índices XML. Observe lo siguiente cuando cree un índice XML: * Debe existir un índice agrupado en la clave principal de la tabla de usuario. * La clave de agrupación de la tabla de usuario tiene un límite de 15 columnas. * Cada columna xml de una tabla puede tener un índice XML principal y varios índices XML secundarios. * Debe existir un índice XML principal en una columna xml para poder crear un índice XML secundario en la columna. * Sólo se puede crear un índice XML en una columna xml única. No puede crear un índice XML en una columna que no sea xml, como tampoco puede crear un índice relacional en una columna xml. * No puede crear un índice XML, ya sea principal o secundario, en una columna xml en una vista, en una variable con valores de tabla con columnas xml o en variables de tipo xml. * No puede crear un índice XML principal en una columna xml calculada. * La configuración de la opción SET debe ser la misma que la requerida para vistas indizadas e índices de columnas calculadas. Específicamente, se debe establecer la opción ARITHABORT en ON cuando se crea un índice XML y cuando se insertan, eliminan o actualizan valores en la columna xml. Para obtener más información, vea Opciones SET que afectan a los resultados. Para obtener más información, vea Índices en columnas de tipo de datos xml. xml_column_name Es la columna xml en la que se basa el índice. Sólo se puede especificar una columna xml en una única definición de índice XML; sin embargo, se pueden crear varios índices XML secundarios en una columna xml. USING XML INDEX xml_index_name Especifica el índice XML principal que se utilizará en la creación de un índice XML secundario. FOR { VALUE | PATH | PROPERTY } Especifica el tipo de índice XML secundario. VALUE Crea un índice XML secundario en las columnas en las que se encuentran las columnas de clave (ruta y valor del nodo) del índice XML principal. PATH Crea un índice XML secundario en las columnas generadas a partir de valores de ruta y de nodo del índice XML principal. En el índice secundario PATH, los valores de ruta y de nodo son las columnas de clave que permiten exploraciones eficaces en la búsqueda de rutas. PROPERTY Crea un índice XML secundario en las columnas (PK, y valor de ruta y de nodo) del índice XML principal, donde PK es la clave principal de la tabla base. Mas info Use full-text search in conjunction with XQuery: To search XML documents or do content-sensitive queries on text, you can combine SQL Server full-text search with XQuery. Full-text search will index the text nodes of XML documents, though not the elements or attributes. You can use the FULLTEXT contains verb to do stem-based or context-based queries over an entire collection of documents (this is most often the top-down part of the query) to select individual documents to operate on, then use XQuery to do structural element and attribute-sensitive structures. Remember that the XQuery contains verb is not at all the same as the FULLTEXT contains verb. XQuery contains is a substring-based function and the SQL Server 2005 implementation uses a binary collation. See XML Support in <http://msdn.microsoft.com/en-us/library/cc411401.aspx> Microsoft SQL Server 2005 by Shankar Pal et al., for an example of combining fulltext and XQuery. -- -------------------------------- Ing. José Mariano Alvarez SQL Total Consulting Bogota 3631 P3B 1407 Buenos Aires-Argentina Movil: (011)-15-4184-7541 Desde el exterior: (+54-911)-4184-7541 [email protected] On Wed, Jan 7, 2009 at 16:50, Carlos Peix <[email protected]> wrote: Hola Mariano, La estructura de los documentos XML es variable, corresponde a distintos tipos de objetos serializadoes mediante serializacion XML del framework. Por lo tanto, si no te entiendo mal, la respuesta es no, los XML no tienen un esquema definido. Pero, en ciertos casos particulares como el ejemplo que indique, puedo asegurar que el documento XML tiene una estructura predefinida. No necesito, en estos casos, usa contains? cual de los dos contains es el que te preocupa? Gracias Carlos Peix _____ De: [email protected] [mailto:[email protected]] En nombre de Jose Mariano Alvarez Enviado el: Miércoles, 07 de Enero de 2009 04:25 p.m. Para: [email protected] Asunto: [dbms] Query full text search y XML Por que contains? El XML tiene algun schema que cumple? -- -------------------------------- Ing. José Mariano Alvarez SQL Total Consulting Bogota 3631 P3B 1407 Buenos Aires-Argentina Movil: (011)-15-4184-7541 Desde el exterior: (+54-911)-4184-7541 [email protected] 2009/1/7 Carlos Peix <[email protected]> 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
