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



Responder a