En equipo se trabaja mejor
Login
Registrarse (gratis)

HOME

El MUG

Eventos

Noticias

Comunidad MUG

VB - VB.Net

C#

J#

Desarrollo Web

SQL - DB


Artículos


Foro


Noticias

FoxPro - Gufa

Infraestructura

Patrones

.NET

Foros y listas

Descargas

Links útiles

Quiénes Somos

Privacidad

Beneficios

Contáctanos

Proyectos

Córdoba

Rosario

Toda la Tecnología Microsoft y Mas
Usando Full Text Index
El manejo de grandes volúmenes de texto siempre es una complicación para los sistemas y sobre todo para nosotros, los desarrolladores.
Publicado por el Tuesday, March 23, 2004
 
Oscar Zarate
Cuando tenemos la necesidad de manejar campos con grandes cantidades de texto empiezan nuestras complicaciones y esto se potencia si el usuario necesita buscar una palabra, por supuesto no la primera palabra de la frase, sino una que esta en cualquier parte de la frase. Aquí es donde hacen su aparición triunfal los productos que permite hacer índices sobre estos campos.

Usando Full Text Index con MS SQL Server

Un claro ejemplo donde encontramos esta necesidad es un sistema para bibliotecas, donde tenemos una tabla con los datos de los libros y esta tabla tiene un campo con un breve resumen (70 palabras) del contenido del libro y debe existir la posibilidad de buscar una palabra dentro de esta “breve” descripción.

Es cierto que existen instrucciones para hacerlo como el LIKE y los meta caracteres de búsqueda, pero ¿intentaron alguna vez hacer una búsqueda de una palabra dentro de una tabla de 20000 registros con un campo de 2100 caracteres con un LIKE?

Ahora bien, si Uds. quieren hacer una búsqueda similar a la anterior y obtener la respuesta en tiempos razonables van a necesitar un índice especifico, no de los clásicos sino uno especial, que en Microsoft SQL Server (SQL) lo administra Full Text Index (FTI).

Les cuento una prueba real, en una tabla de 2 millones de registros que tiene un campo de 75 caracteres, hacer una búsqueda con LIKE que retorna un registro con la cantidad correspondiente (SELECT COUNT) lleva 1’ 22” (un minuto y 22 segundos) y la misma consulta a través de un FTI tarda 5” la primera vez y 3” las siguientes. Nada mal.

Full Text Search es el servicio de indexación de texto libre del que dispone Windows y se puede usar para búsquedas en páginas HTML entre otras tantas cosas. Este servicio está integrado a Microsoft SQL Server 2000 (se instala junto con el servidor de base de datos) y con Microsoft SQL Server 7.0 (pero hay que solicitar la instalación, puesto que no está seleccionada por default). Este mismo servicio es el que resuelve nuestro problema.

Figura 1: Componentes de SQL Server (tomado del Book OnLine de Microsoft SQL Server)

 Cuando instalen FTI verán que dentro del SQL Service Manager (icono que se ubica en el Tray Icon) un ítem (en el combo de servicios) correspondiente al Microsoft Search. Ahí podrán ver que este servicio funciona en un proceso separado a SQL y que puede estar parado o funcionando por separado. O sea, el FTI estará STAR o STOP mas a allá que el SQL esté START. Al igual que el SQL, podemos setear para que el servicio de FTI se inicie al arrancar la máquina.

Como he mencionado el servicio funciona por separado, como así también el manejo de índice (sí bien está muy integrado). Esto implica que cuando quieran usar un índice de FTI deban habilitarlo desde una opción especial.

Cada tabla de una base de datos podrá tener un archivo de FTI relacionado, pudiendo tener dentro de este índice, uno o más campos indexados. A este índice se lo conoce como CATALOGO.

A diferencia de un índice común de SQL, al finalizar la creación de un catálogo este no está listo para ser usado sino que debe ser populado. Este es un proceso que se dispara por separado y que hace que el índice se cargue con el contenido correspondiente.

Veamos un ejemplo simple: en este caso vamos crear un catálogo dentro de la base de datos PUBS que viene con SQL, para la tabla TITLES.

Figura 2: Creando un catálogo dentro de una base de datos

 

Desde el Enterprise Manager, hacemos click con el botón derecho sobre la tabla y elegimos Full-Text Index Table y dentro de esta la opción Define Full-Text Indexing on a Table... que es la única habilitada. Esto nos abrirá un Wizard para crear el catalogo.

Los pasos son:

  1. Seleccionar el índice de unicidad (Unique index).
  2. Seleccionar los campos a indexar. En este ejemplo el campo TITLE.
  3. Seleccionar el nombre físico del archivo que contendrá el catálogo y su ruta. En el caso del ejemplo la ubicación será la default y el nombre del catalogo TITULOS.

  4. Luego nos ofrece crear una tarea programada (Schedule Task) para popular el catálogo, que en nuestro ejemplo la omitiremos para realizar el llenado del catalogo a mano.

  5. Finalmente confirmamos la creación del catálogo.

Bien, luego de estos pasos tenemos el catálogo creado pero vacío, como siguiente etapa popularemos el catálogo.

Desde el Enterprise Manager, hacemos click con el botón derecho sobre la tabla y elegimos Full-Text Index Table y dentro de esta la opción Start Full Population esto nos retornará una ventana indicando que el proceso se inició.

Figura 3: Poblando un catálogo

 

Como dije antes, esto se corre en un proceso separado por lo cual no recibiremos aviso sobre cuando termina el proceso. En este caso, al ser una tabla pequeña (por default trae 18 registros) el tiempo que tarde en popular será muy chico, pero en tablas grandes los tiempos aumentarán exponencialmente.

Para saber el estado de este proceso, podemos hacer click en la carpeta de catálogos de Full-Text (Full-Text Catalogs) de la base de datos PUBS. Ahí veremos que existe un registro del catálogo recién creado y si nos fijamos en la columna correspondiente a estado (Status) dirá “Idle” cuando halla terminado el proceso o “Population in Progress” durante el proceso.

Finalmente haremos una prueba sobre el Query Analizer donde escribiremos

select * from titles where contains(*, 'silicon')

veremos que retorna dos registros correspondientes a dos libros en cuyo título figura la palabra Silicon.

Aquí finaliza la introducción al uso de Full Text Index, vimos una explicación somera de los componentes y vimos como crear, popular y usar un índice de texto. A continuación explicaré como utilizar esto dentro del mundo real de los sistemas, administración avanzada de los índices de FTI y los pros y los contras de este sistema de trabajo.

NOTA: Durante mis años de trabajo con FoxPro tuve que resolver este tema con DBFs y lo hice con un producto llamado PHDBASE que lamentablemente se ha dejado de comercializar. Digo lamentablemente porque es un producto que trabaja muy bien con las DBF y el uso es casi transparente. Solo debemos agregar el manejo de esta librería y aprendernos unos simples predicado y podremos indexar campos MEMO. Actualmente existen otros productos que hacen este trabajo sobre DBFs, pero no puedo dar referencias puesto que no he trabajado con ellos.

Usando Full Text Index en la vida real

Si bien el ejemplo anterior es completamente real, no sería un caso en el cual es imprescindible el uso de FTI, puesto que una búsqueda usando LIKE nos hubiese respondido con eficacia a la consulta (no con eficiencia, pero si con eficacia), pero si tenemos tablas con muchos registros y campos mas variados el uso se hace imprescindible.

Antes de continuar profundizando en el uso de FTI, sería bueno comentar las recomendaciones que tiene Microsoft sobre el uso de este servicio.

Microsoft recomienda mantener los archivos físicos de catálogos en otro disco distinto al que tiene la base de datos. También recomienda que las tablas no superen el millón de registros. Además recomienda máquinas potentísimas con mucha RAM, muchos procesadores y mucho disco. Cumpliendo estas recomendaciones el FTI vuela, ahora bien no todas las instalaciones tienen equipos tan bien dimensionados, pero le aseguro que con máquinas normales (para lo que se necesita como servidor) los resultados son realmente excelentes.

Profundizando en el uso de FTI

El manejo de los catálogos se puede hacer desde el Enterprise Manager (ver el ejemplo anterior) como así también desde el Query Analizer.

Como vimos en el ejemplo el primer paso para generar un catálogo fue la creación del mismo. Lo hicimos desde Enterprise Manager, hacemos click con el botón derecho sobre la tabla y elegimos Full-Text Index Table y dentro de esta la opción Define Full-Text Indexing on a Table... y seguimos el Wizard. Para realizar la misma operación desde el Query Analizer en la base de datos que queramos indexar (PUBS para el ejemplo) haremos:

-- Habilitar la Base de datos para trabajar con FTI
   sp_fulltext_database N'enable'

-- Con esta instrucción obtendremos el estado de la base de datos con respecto a FTI.
   select DATABASEPROPERTY(DB_NAME(), N'IsFullTextEnabled')
-- 0 => deshabilitada y 1=> habilitada para FTI.

-- Con la invocación a este Store Procedure, crearemos el catálogo llamado TITULOS .
   exec sp_fulltext_catalog N'TITULOS', N'create'

-- Con la invocación a este Store Procedure, seleccionamos la clave única
   sp_fulltext_table N'[dbo].[titles]', N'create', N'TITULOS', N'UPKCL_titleidind'
-- Es imprescindible tener una clave única.

-- Con la invocación a este Store Procedure, elegimos el campo a indexar y el idioma.
   sp_fulltext_column N'[dbo].[titles]', N'title', N'add', 3082
-- El valor 3082 => español moderno (0x0c0a), se puede usar otros como 0 para neutral o 1033 
-- para ingles americano (0x0409) o 2057 para ingles de UK (0x0809), etc.

-- Finalmente con la invocación a este Store Procedure, activaremos el catálogo.
   sp_fulltext_table N'[dbo].[titles]', N'activate'

El siguiente paso será popular el catálogo que se hace con

-- Con la invocación a este Store Procedure, iniciaremos el populado del catálogo.
   sp_fulltext_catalog N'TITULOS', N’start_full’

Con esta instrucción podremos saber el estado en que se encuentra el catálogo.

   Select FullTextCatalogProperty(N’TITULOS’, N 'PopulateStatus')
-- Que nos retorna 0 => si está Idle y 1=> si el proceso está corriendo, entre otros valores.

Poblando catálogos

En el ejemplo anterior vimos, tanto en el que realizamos por el Enterprise Manager como desde el Query Analizer, hicimos un Full Population e ignoramos la opción de Incremental Population, esto es porque la primera vez que populemos un catálogo es lo mismo pedir una proceso completo (Full Population) que el llenado incremental del mismo (Incremental Population). El fin real de la opción incremental es para ir agregando registros a la tabla y que estos se vean reflejados en el catálogo (recuerden que FTI trabaja por separado del motor de base de datos y el hecho de agregar registros a la tabla no implica que los mismos están en el catálogo de FTI).

El llenado incremental del un catálogo, solo funciona con los registros agregados a una tabla si la misma posee un campo Timestamp, este se usa internamente para que el motor sepa que registro debe agregar. Si este campo no está presente el llenado será total aún pidiendo un llenado incremental.

Instrucciones de T-SQL para FTI

Las principales instrucciones (en realidad son predicados, puesto que normalmente los usamos como parte de un SELECT) para realizar búsquedas en un catalogo de FTI son:

Instrucción Uso
CONTAINS Se utiliza para buscar en columnas de con datos tipo texto que tengan coincidencias exactas o aproximadas, con palabras exactas o con cierta cercanía. Se puede buscar una palabra, una frase, el prefijo de una palabra o una frase, una palabra cerca de otra, etc.
FREETEXT Se utiliza para buscar en columnas de con datos tipo texto que coincidan con el significado y no literalmente con el contenido. Las consultas realizadas con FREETEXT tienen menos precisión que las realizadas con CONTAINS.
CONTAINSTABLE Devuelve una tabla con una o más filas para aquellas columnas que contengan datos de tipo carácter en las que haya coincidencias exactas o aproximadas con palabras simples o frases, palabras próximas a otra dada (dentro de una cierta distancia), etc.
FREETEXTTABLE Devuelve una tabla de cero, una o varias filas cuyas columnas contienen datos de tipo carácter cuyos valores coinciden con el significado, aunque no literalmente, del texto especificado.

Lista de palabras comunes

En todo catálogo existen palabras comunes que son deseables que no sean indexadas. SQL trae un archivo por idioma (NOISE.ESN, NOISE.ENG, NOISE.ENU, etc.) con una lista de palabras comunes que esta en el directorio \MSSQL\FTData\SQLServer\Config. Estos archivos pueden ser modificados y será tenido en cuenta al momento de la populación del catálogo. Si realizamos una búsqueda incluyendo solo una palabra incluida en dicho archivo SQL nos responderá con un mensaje de “solo palabras ignoradas” (A clause of the query contained only ignored words).

Recomendaciones de uso

Microsoft recomienda no superar el millón de registros por tabla, mi experiencia es que con dos millones funciona muy bien, incluso con 4 millones también, pero hay que tener en cuenta que los tiempos de populado son altos.

Ahora bien, ¿qué pasa cuando tenemos tablas con más cantidad de registros? En mi caso les cuento que tuve que realizar sistemas con manejos de 20 millones de registros y conozco casos que había que manejar 50 millones de registros. La solución pasó por dividir la tabla horizontalmente en varias tablas y hacer búsquedas paralelas.

Esto sobre todo es fundamental si se trabaja sobre un SQL 7.0 puesto que si mandamos a popular un catálogo con mayor número de columnas el proceso nunca finaliza. Esto en la versión 2000 está solucionado, pero los tiempos que tarda en popular un catalogo de 2 millones de registros es de unas 6 horas en una máquina con 2 procesadores, 1024 Mb de RAM y discos SCSI y de unas 14 horas en una máquina con 1 procesador, 512 RAM y discos IDE. He realizado pruebas para popular una tabla de 15 millones de registros (con SQL 2000) y tardó 54 horas.

Conclusión

Si alguna vez necesita trabajar con indexación de grandes volúmenes texto sobre tablas de SQL Server, dispondrá de una herramienta realmente poderosa. Full Text Index responde de manera espectacular a las consultas complicadas y es lo suficientemente versátil como para trabajar en máquinas no tan potentes. La única precaución a tener es cuando disponemos de gran cantidad de registros. Deberá disponer de un tiempo inicial alto y tal vez deba pensar en partir sus tablas horizontalmente para obtener excelentes resultados.

Oscar Zárate es Licenciado en Administración de Empresas y Analista de Sistemas. Trabaja como desarrollador desde 1987, pasando desde las primeras versiones del FoxBase a través de Clipper hasta las actuales versiones de Visual FoxPro, como así también ha trabajado con Visual Basic, ASP, XML, SQL Server entre otras herramientas. Actualmente está trabajado en Syncromind con .NET en desarrollos Web e implementación de Metodologías (RUP, MSF, etc.). Se lo puede ubicar en oscar.zarate@mug.org.ar.

Calificación promedio:
Comentarios:
Pendiente: Que pasa si la consulta no arroja un resultado Realizado por baezage el Tuesday, April 27, 2004
El artículo es excelente, solamente tiene pendiente que pasa si la instrucción T-SQL, no arroja ningún resultado, aunque exista la información. Además, como se sabe si el catálogo tiene la información asociado con Full-Text-indexing.
Responder este comentario
Re: Pendiente: Que pasa si la consulta no arroja un resultado Realizado por ozarate el Tuesday, April 27, 2004
Emilio: muchas gracias por tu comentario.
Con respecto al tema que planteas como pendiente, no termino de entender la pregunta.
¿Vos decís que pasa si, por ejemplo
select * from titles where contains(*, 'silicon')
no trae nada? Pasa lo mismo que cuando haces select * from titles y titles está vacia, te dice 0 rows ...
Por otro lado decís ... "aunque exista la información", en ese caso ¿no estará faltando "popular" el índice? o sea, lo creaste pero no le hiciste "populate" y le agregaste datos y no hiciste luego el "populate".

Tampoco entiendo: "como se sabe si el catálogo tiene la información asociado con Full-Text-indexing", me podrías repetir esta pregunta de otra forma, no la entiendo.

Saludos.

Responder este comentario
Problema presentado Realizado por baezage el Wednesday, April 28, 2004
Oscar, muchas gracias por ver el comentario y responder tan pronto. A continuación te indicó el problema que creo que se me está presentando:

1. El catalogo creado no contiene ningún dato. Esto debido a que ejecutar la sentencia T-SQL “select * from gdaCorrespondencia where contains(corAsunto, 'Norma')”, no presenta ninguna tupla aunque existe el texto.

2. A mi parecer el catalago no contiene datos para hacer la búsqueda, esto debido a que el tamaño siempre es el mismo 1MB.

Los pasos seguidos para crear el catalogo son:

a) Crear el catalogo llamado “gdaFTI” en la opción “Full-Text Catalogs”.

b) Escoger la tabla llamada “gdaCorrespondencia”, seleccionar la opción “full-text index table”, elegir el campo “corAsunto”, seleccionar el catalogo creado “gdaFTI” y crear el indice (esto con el wizard). Para activar el catalogo se selecciona la opción “Start full population”

c) Seguidamente escoger la tabla llamada “gdaArchivoPermanente”, seleccionar la opción “full-text index table”, elegir el campo “apeTitulo”, seleccionar el catalogo creado “gdaFTI” y crear el indice (esto con el wizard). Para activar el catalogo se selecciona la opción “Start full population”


d) Ubicarse el la opción “Full-Text Catalogs”, seleccionar el catalogo “gdaFTI” y eligir “Start Full Population”. Esta opción presenta un mensaje “Population of full-text catalog started successfully”

La creación del catalogo la ejecute con las formas que plantea en el artículo o sea primeramente por “SQL Server Enterprice Maneger” y al no funcionar elimine el catalogo y lo cree por medio de las instrucciones en la herramienta “Query Analyzer” y el resultado fue el mismo, a ejecutar la sentencia T-SQL.

La pregunta sería, ¿Existe alguna forma para ver la información que contiene el catalogo, sin utilizar una sentencia T-SQL?. ¿El tamaño del catalogo debe crecer y no quedarse en 1MB?

Oscar de antemano, muchas gracias por tu ayuda y como te indique en el comentario anterior es excelente y muy claro el artículo.

Responder este comentario
Como obtener ayuda en las listas de correo Realizado por JMAlvarez el Wednesday, April 28, 2004
Te comento que tenemos en el MUG listas de correo en la cual habitualmente hay gente pidiendo ayuda y otra dando una mano respondiendo con sus conocimientos. Diariamente se envían más de 100.000 correos diarios si sumamos todos los suscriptores de todas las listas para que tengas una idea.

Si lo deseas, puedes encontrar la informacion para suscribirte en:
http://www.mug.org.ar/Foros/Listas/Suscripcion/default.aspx

Responder este comentario
Re: Pendiente: Que pasa si la consulta no arroja un resultado Realizado por ozarate el Wednesday, April 28, 2004
Emilio: evidentemente pasa algo raro.
En el catálogo, si haces "botón derecho" y elegís propiedades podes ver la cantidad de registros agregados al mismo.
¿Probaste con otras instrucciones SELECT? porque podría ser que NORMA esté como palabra a no ser indexada. Esto es, existe un archivo donde se ponen las palabras repetidas muchas veces, por ejemplo en el archivo default de ingles figura la palabra "THE" para que no se ingrese al catálogo.
Pero realmente, si seguís los pasos, debería funcionar. ¿Probaste el ejemplo con las tablas de Pubs (la base de datos de ejemplo)?

Responder este comentario
Pendiente: Que pasa si la consulta no arroja un resultado Realizado por baezage el Wednesday, April 28, 2004
Oscar, Cada paso lo he realizado y si realize el ejercicio con la bd de prueba "Pub". Pero siempre el resultado fue negativo. Viendo las propiedades del catalogo, el atributo "Item count" se presenta en 0.

A SQL-Server no hay que configurarle alguna condición para el funcionamiento del "Full-text Catalogs".

De todos modos muchas gracias por el tiempo y tu ayuda.

Responder este comentario
Re: Pendiente: Que pasa si la consulta no arroja un resultado Realizado por ozarate el Wednesday, April 28, 2004
Si tenes SQL 2000, no hay que instalar nada (en SQL 7 había que instalarlo por separado).

Responder este comentario
Re: Re: Pendiente: Que pasa si la consulta no arroja un resultado Realizado por jgarciab el Wednesday, May 26, 2004
A mi me pasa lo mismo que a baezage, estoy usando FreeText, y no me arroja ningún resultado, incluso despues de haber hecho ambas "populaciones". ¿Cúal es la diferencia entre "Full Population" e "Incremental Population"?
Mi query no puede ser más sencillo:
select
DataPoints.*
from
DataPoints
where
freetext(DataPoints.Nombre , ' "*TL*" ')
La tabla DataPoints tiene info geoposicional sobre lugares, y el Campo nombre es un nvarchar(255), con los nombres de los lugares. Así, yo esperaría que el query retornara (como un LIKE):
AMATITLAN
ATITLAN
...

pero el resultado es vacío.

Gracias.

Responder este comentario
Re: Que pasa si la consulta Realizado por ozarate el Wednesday, May 26, 2004
Lo primero que te diría es que pruebes con
select DataPoints.* from DataPoints where
freetext(DataPoints.Nombre , 'ATITLAN')
para ver si tenes algún resultado. Fijate si te está funcionando el FTI.

Probá haciendo:
sp_fulltext_database N'disable'
para deshabilitar el FTI
sp_fulltext_database N'enable'
para rehabilitar el FTI

Y volvé agenerar los catálogos.

Con respecto a la diferencia es:
Full Population: Regenera los catálogos COMPLETOS, sobre todos los registros.
Incremental Population: Sólo agrega los registros que fueron modificados desde el último "population", para este segundo caso necesitas un campo timestamp (que identifica cuales fueron modificados).

Por favor, avisen si sigue sin funcionarles. Les recomiendo que sigan paso a paso el ejemplo para ver que tienen todo habilitado y les funciona el FTI correctamente.

Responder este comentario
Sin Funcionar Realizado por baezage el Thursday, May 27, 2004
Oscar, hasta el día de hoy la consulta no funciona y como te indique anteriormente las cantidad de registros es 0.

Elimine el catálogo y lo volví a generar pasa por paso, sin recurir al Wizard y obtuve el mismo resultado o sea un catálogo sin datos.

Responder este comentario
Re: Sin funcionar Realizado por ozarate el Thursday, May 27, 2004
A ver ... en el Enteprise Manager, en la base de datos correspondiente, el la carpeta "Catálogos de Texto", tenes el catálogo correspondiente. En la columna ESTADO: ¿está inactivo? y en la columna FECHA DE ULTIMO LLENADO: ¿dice la fecha de tu último POPULATION?
Responder este comentario
Full Text Search Realizado por ametur el Tuesday, June 29, 2004
Yo implementé esto en una base de datos que necesita guardar resoluciones o documentos de más de una página. Necesito que se puedan hacer búsquedas y por eso usé este método, pero sucede que ahora cada vez que ingreso un registro en dos tablas asociadas, donde una de ellas tiene el índice del full text search, el programa se me queda un largo tiempo esperando hasta que aparece el mensaje de que el registro ha sido adicionado. No sé que pasa, tengo un incremental population, no sé si tiene algo que ver con la lentitud. Por favor ayúdame.


Responder este comentario
Re: Full Text Search Realizado por ozarate el Tuesday, June 29, 2004
Mirá, los motores de SQL y FTS son idenpendientes con lo cual cada uno corre independientemente. O sea, la lentitud pasa por otro lugar, seguramente por la cantidad de índices o por lentitud propia del Hardware.

Con respecto al llenado incremental de los catálogos está bien, pero tene en cuenta que la idea de FTS es para trabajos batch, no funciona on-line.

Espero haberte ayudado y cualquier cosa, no dudes en consultar.

Responder este comentario
¿Qué pasa con los acentos? Realizado por imelda el Monday, August 30, 2004
Tengo una tabla de SQL2000 donde debo hacer búsquedas de texto completo. Hasta el momento no he tenido problemas excepto con las palabras acentuadas.

Ya cambié la intercalación de los campos del índice de texto a SQL_Latin1_General_CP1_CI_AI, volví a generar el catálogo e hice el llenado completo. No funcionó.

Probé también con la intercalación (de Windows) Modern_Spanish_CI_AI y tampoco funcionó. La búsqueda de 'maratón' devuelve registros mientras que la de 'maraton' no.

¿Alguna idea de qué puedo hacer?

Gracias ;)!

Responder este comentario
Re:¿Qué pasa con los acentos? Realizado por ozarate el Monday, August 30, 2004
Hola!

No entiendo muy bien. ¿Queres que la busqueda tome por igual un caracter con tilde que uno sin tilde?

O sea 'Maratón' = 'Maraton'

Responder este comentario
Acentos :) Realizado por imelda el Tuesday, August 31, 2004
Exacto!

Que al escribir "maraton" busque los campos que contienen "maratón" y "maraton".

Gracias de nuevo :D

Responder este comentario
datset repite datos Realizado por ramonet el Friday, September 10, 2004
en un dataset ejecuto lo siguiente:
dsReturn = SqlHelper.ExecuteDataset( oCnx, "Search", sqlParams);
el store procedure contiene :
SELECT * FROM PAGES WHERE CONTAINS(*, 'deportes') pero me devuelve dos veces el mismo dato y solo lo tengo una vez, pero en esta otra :
SELECT * FROM PAGES WHERE CONTAINS(*, '"dep*"')
solo me devulve una vez, que esta pasando, el * representa a las dos columnas indexadas, gracias por su atención

Responder este comentario
Re:datset repite datos Realizado por ozarate el Friday, September 10, 2004
¿Que pasa cuando haces eso mismo desde el Query Analizer?
Responder este comentario
No me funciona Realizado por LuisJa el Friday, October 22, 2004
Hola amigos,
resulta que a mi me pasa lo siguiente: Cuando la busqueda encuentra algo me sale el siguiente error:
"Una clausula de la consulta solo contenia palabras omitidas"
Les suena??
Hago la siguiente consulta:

SELECT *
FROM Trabajo
WHERE FREETEXT(Nombre, ' "primer trabajo" ')

Y cuando existe algún trabajo en cuyo nombre está la palabra 'primer', por ejemplo, me sale el error antes comentado. Lo mismo me pasa si en vez de usas FREETEXT uso CONTAINS.
Tiene algo que ven que el estado de mi catalogo esté a 'inactivo' ?? Y si es así, como lo puedo poner a 'activo' ??

Un saludo y gracias por su tiempo.

Responder este comentario
Re: No me funciona Realizado por ozarate el Friday, October 22, 2004
Vamos por parte. Con el catálogo inactivo NO podes hacer búsquedas sobre él. En esta nota dice como ponerlo activo. Tiene que estar activo el FTS.

El mensaje que te da, te está indicando (a pesar que no debería dar nada) que las palabras buscadas están en el archivo de palabras omitidas.
FTS tiene un archivo donde le definís las palabras que no queres buscar por ser comunes (imaginate hacer una busqueda sobre la palabra "un" dentro de una tabla con varios millosnes de registros con una explicación, te saldrían muchas respuestas y perderías tiempo innecesariamente).

Responder este comentario
No se me activa.... Realizado por LuisJa el Friday, October 22, 2004
Hola Oscar,
el problema es q no consigo activar el catalogo. Hago como tu indicas en el tutorial:

sp_fulltext_table N'[dbo].[titles]', N'activate'

Desde el analizador de querys, pero no hay manera, sigue en estado 'inactivo'.
Y respecto a las palabras que estan en el archivo de palabras omitidas... quien las metió en ese archivo?? Como puedo editar dicho archivo??

Un saludo y mil gracias.

Responder este comentario
Re: No te activa Realizado por ozarate el Friday, October 22, 2004
Te recomiendo que primero sigas los pasos vía el Enterprise Manager y cuando hayas hecho varios te pases a la versión de "código". Me suena que no estas populando (o poblando) el índice, pero debería verificar un poco más tu caso en particular. Seguro con los Wizards va a andar mejor.

Los archivos "NOISE" están en \Program Files\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config
y tenes uno por cada idioma. Nuevamente te recomiendo que hagas pruebas con el archivo default y que cuando hayas avanzado un poco te metas con temas más avanzados.

Responder este comentario
Ya esta Realizado por LuisJa el Friday, October 22, 2004
Perdona Oscar, pero después de leerme por segunda vez tu tutorial, descubrí como editar el fichero de palabras omitidas. Lo abrí y... resulta que entre las palabras omitidas estaban 'primer','segundo',... que casualmente eran las palabras que yo estaba buscando.
Gracias a tu tutorial he aprendido a trabajar con indices de texto, me parece muy bueno y pienso recomendarlo a todas mis amistades.
Un saludo!!

Responder este comentario
Programaciones Llenado Catalogo Realizado por Ale el Tuesday, October 26, 2004
Buenas, lo primero, felicitarte por el articulo.
Planteo mi problema. Tengo un catalogo creado para una tabla de noticias, esta perfectamente creado, y el indice lleno. Las consultas se resuelven correctamente, sin embargo, el problema me llega cuando le asocio una programacion de llenado incremental, asi, por ejemplo, tengo una para todos los dias a las 4:30 am, pero no la hace (he probado a ponerle llenado total, por si colaba por ahi, pero nada). En fin, que tengo que hacer el llenado incremental manualmente cada x tiempo, y claro, pierde la gracia. No consigo entender porque no funciona.
Un dato: En Catalogos de texto, me aparece lo siguiente:
Nombre: catNoticias, Ubicacion: C:\Archivos..., Estado: Inactivo, Fecha del ultimo llenado: tal.
El catalogo esta inactivo, ¿debe estar asi? No se, me llama la atencion, aun asi, las consultas funcionan correctamente, por lo que no se si debe estar inactivo, creo que si, en tu articulo, dice que tras el llenado se pondra en estado iddle (inactivo). A ver si alguien me podria echar un cable, a ver que pasa con el tema de las programaciones.

Otra cosa, yo tambien tengo el problema de las tildes, es decir, me gustaria ignorarlas, por ejemplo, si introduzco en mi buscador "jovenes" no encuentra nada, mientras que si introduzco "jóvenes", si que encuentra. Probe las dos intercalaciones que se supone que ignoran mayusculas y tildes, pero no consegui solucionar lo de las tildes (las mayusculas sin problemas).

Bueno, gracias por anticipado, un saludo :)

/* Tildes omitidas intencionadamente. */

Responder este comentario
Re: Programaciones Llenado Catalogo Realizado por ozarate el Tuesday, October 26, 2004
Confirmamelo, pero estoy 99% seguro que el problema es que no tenes el SQL SERVER AGENT prendido.

El estado Idle (Inactivo) es el correcto luego de haber llenado el catálogo. Tené en cuenta que va a cambiar cuando esté llenando el catálogo.

Con respecto al tema de los tildes, lo voy a investigar, pero seguramente pasa por el modo en que están instalados los servicios.

Responder este comentario
Gracias por la ayuda Realizado por Ale el Tuesday, October 26, 2004
Gracias por la ayuda, todo parece correcto, he hecho una prueba y genial.

Un saludo :)

Responder este comentario
Consultar con Contains(name, '*logol') Realizado por ross4 el Tuesday, October 26, 2004
No es respuesta,en realidad es una duda que tengo agradezco su valiosa ayuda de antemano. Mi problema es : uso la sentencia para realizar una prueba de consulta que necesito:
ej.
select * from titles where contains(title, 'sili*')

me devuelve todos los registros donde la palabra empieze con sili, quise realizarlo al reves, donde no me importe con el prefijo o palabra que empiece, sino que termine con cierta palabra, pero no me envia ningun registro, nose si eso es valido con CONTAINS u otra sentencia, el campo sobre el que realizo la busqueda solo contiene una palabra.
agradecere mucho su ayuda.
Atte.Rosario

Responder este comentario
Re: Consultar con Contains(name, '*logol') Realizado por ozarate el Tuesday, October 26, 2004
Según el manual podes:
CONTAINS can search for: The prefix of a word

Lo siento. :-(

Con respecto a las palabras acentuadas sólo se me ocurre buscar con algo tipo:

select * from customers where contains(*, '"zarate" or "zárate"')

Responder este comentario
buscar en dos campos indexados y concatenados Realizado por ross4 el Thursday, October 28, 2004
Hola, gracias por su pronta, respuesta, estoy realizando busqueda en campo con muchas variaciones entonces me surge otra duda. es posible concatenar dos campos indexados en la busqueda.
ej
select *
from nametabla
where(campo1&campo2, 'AT-2465')

gracias por tomarse la molestia a responderme :), es que es la primera vez q uso
catalogos de bùsqueda.
Atte. Ross

Responder este comentario
Re: buscar en dos campos indexados y concatenados Realizado por ozarate el Thursday, October 28, 2004
Si ambos campos están en el catálogo te lo va a buscar con
SELECT * FROM tabla
WHERE contains(*, 'AT-2465')

pero no esperes que AT esté en un campo y 2465 en el otro. Estará en el campo1 o en el campo2 pero no parte y parte.

Los invito a seguir estas charlas en dbms@mug.org.ar

Responder este comentario
El Catalogo no popula Realizado por javylez el Thursday, February 24, 2005
Hola amigos yo segui fielmente los pasos del ejemplo PUBS, pero no genera resultados, además haciendo clic derecho sobre el catalogo su propiedad item count =0, por favor solicito su ayuda, gracias!!!
Responder este comentario
Re:El catalogo no popula Realizado por ozarate el Friday, February 25, 2005
¿Podrías dar alguna explicación extra?

Version del SQL, SP, ¿esta activado el servicio de Full Text Serch? Etc.

Gracias.

Responder este comentario
El Catalogo no popula Realizado por javylez el Saturday, February 26, 2005
gracias muy amable por contestar mis dudas y ayudarme a resolver mis problemas, la versión de SQL es 2000 Server, el Service pack es el 3, los servicios como microsoft Search , SQL Agent y el coordinador de transacciones están activados!! el problema está en que el ejemplo que ustedes ofrecen no genera resultados en mi servidor, ya intenté ejecutarlo desde enterprise manager y lo hice también através del Query Analyzer!! realmente aprecio su apoyo!! gracias!!
Responder este comentario
Re:El catalogo no popula Realizado por ozarate el Saturday, February 26, 2005
Hay dos posibilidades:

1.- Hacer refresh y que aparezcar todo mágicamente (lo dudo, pero ...)

2.- Verificar el Event Viewer, debería haber algún error allí.

Saludos.

Responder este comentario
Visor de sucesos Realizado por javylez el Monday, February 28, 2005
Hola como han estado, gracias nuevamente por su apoyo, traté de actualizar como me sugirió pero no resultó, por otro lado revisé el visor y me mostró la siguiente advertencia y dos mensajes de información!!

TIPO: ADVERTENCIA
ID SUCESO: 3036
ORIGEN: MICROSOFT SEARCH
CATEGORIA: RECOPILADOR

No se tiene acceso al origen del rastreo <MSSQL75://SQLServer/7e6cc920> en el proyecto <SQLServer SQL0000500005>. Error: 800705b4 - Esta operación ha regresado debido a que el tiempo de espera ha caducado. .

REM //////////////////////////////////////////

TIPO: INFORMACION
ID SUCESO: 3047
ORIGEN: MICROSOFT SEARCH
CATEGORIA: RECOPILADOR

Se detectó el final del rastreo incremental en el proyecto <SQLServer SQL0000500005>. El Recopilador procesó con éxito 0 documentos, en total 0K. Error al filtrar 1 documentos. Se modificaron 0 documentos. No se pudo localizar 0 direcciones URL o se denegó el acceso.

REM ////////////////////////////////////////

TIPO: INFORMACION
ID SUCESO: 7045
ORIGEN: MICROSOFT SEARCH
CATEGORIA: INDIZADOR

No se detectaron archivos nuevos para el proyecto <SQLServer SQL0000500005>. No se propagó el catálogo.

tal vez me pueden ayudar nuevamente!! gracias de desde ya!!!

Responder este comentario
Index unique con dos campos Realizado por wduenas el Monday, April 11, 2005
Hola oscar mira tengo el siguiente problema en un misma tabla grabo diferentes documentos como boletas de ventas , facturas , y docuemtnos internos bueno el asunto es que grabo tres campos importantes que es el id_Factu que es un correlativo del sitema serie(la serie del documento si es 000, es DI, 001 BV,002 FA) y un campo que es el numero del documento que se puede reperit con diferentes numeros de series pero nunca con la misma serie lo que queiro hacer si es que se puede poner el campo serie y el numero como un idex unique como lo puedo hacer???? te agradeceria tu respuesta
Responder este comentario
A clause of the query contained only ignored words Realizado por angek7 el Tuesday, April 26, 2005
Hola que tal
Al estar haciendo uso del Full Text Index
me marca el siguiente error, no se si me puedqan ayudar.
Numero de error -2147217900
Descripcion Execution of a full-text operation failed. A clause of the query contained only ignored words.
*******************************************************
SELECT * from Tabla WHERE contains (Columna,'as')

Responder este comentario
Re: A clause of the query contained only ignored words Realizado por ozarate el Wednesday, April 27, 2005
El mensaje de error dice: que sólo estas usando en la consulta palabras incluidas en la lista a ser omitidas. Esto es porque estas buscando la palabra AS que es muy común en Ingles y que está incluida en el archivo default de palabras omitidas. Creo que figura en la nota como cambiarlo. Saludos (Australianos)
Responder este comentario
Archivos NOISE Realizado por rpraena el Thursday, August 11, 2005
Hola
Primero de todo, felicitarte por el artículo, me ha parecido buenísimo y me ha ayudado mucho. Después, me gustaria hacerte unas cuantas preguntas sobre los archivos NOISE a ver si pudieras ayudarme. Ahí van
Cuando se crean y actualizan estos archivos? Al crear los catálogos y/o al popularlos?.
Estos archivos son comunes a todas las Bases de Datos del servidor o son independientes para cada Bases de datos con Catalogos?
Se pueden editar estos archivos para que sean tenidas en cuenta otras palabras indexables a la hora de hacer busquedas? Supongo que sí que se pueden añadir más palabras pero eliminar las existentes no implicaría un mal funcionamiento en las búsquedas fulltext

Bueno creo que ya está bien. Muchísimas gracias

Responder este comentario
Codigo sql buscar sin tildes Realizado por wwwcad el Saturday, June 17, 2006
Aqui esta un ejemplo del codigo sql para reemplazar tildes y el caracter ñ.

SELECT * FROM content WHERE REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE ( LOWER(title),'á','a'), 'é','e'),'í','i'),'ó','o'),'ú','u'),'ñ','n') = 'titulo';

Tambien se puede usar la funcion soundex http://dev.mysql.com/doc/refman/5.0/en/string-functions.html aunque la consulta anterior fue suficiente para mi.

--
Carlos Devia
http://www.imaginacolombia.com
http://www.enibague.com

Responder este comentario
Codigo sql buscar sin tildes Realizado por wwwcad el Saturday, June 17, 2006
Aqui esta un ejemplo del codigo sql para reemplazar tildes y el caracter ñ.

SELECT * FROM content WHERE REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE ( LOWER(title),'á','a'), 'é','e'),'í','i'),'ó','o'),'ú','u'),'ñ','n') = 'titulo';

Tambien se puede usar la funcion soundex http://dev.mysql.com/doc/refman/5.0/en/string-functions.html aunque la consulta anterior fue suficiente para mi.

--
Carlos Devia
http://www.imaginacolombia.com
http://www.enibague.com

Responder este comentario
Codigo sql buscar sin tildes Realizado por wwwcad el Saturday, June 17, 2006
Aqui esta un ejemplo del codigo sql para reemplazar tildes y el caracter ñ.

SELECT * FROM content WHERE REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE ( LOWER(title),'á','a'), 'é','e'),'í','i'),'ó','o'),'ú','u'),'ñ','n') = 'titulo';

Tambien se puede usar la funcion soundex http://dev.mysql.com/doc/refman/5.0/en/string-functions.html aunque la consulta anterior fue suficiente para mi.

--
Carlos Devia
http://www.imaginacolombia.com
http://www.enibague.com

Responder este comentario
Codigo sql buscar sin tildes Realizado por wwwcad el Saturday, June 17, 2006
Aqui esta un ejemplo del codigo sql para reemplazar tildes y el caracter ñ.

SELECT * FROM content WHERE REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE ( LOWER(title),'á','a'), 'é','e'),'í','i'),'ó','o'),'ú','u'),'ñ','n') = 'titulo';

Tambien se puede usar la funcion soundex http://dev.mysql.com/doc/refman/5.0/en/string-functions.html aunque la consulta anterior fue suficiente para mi.

--
Carlos Devia
http://www.imaginacolombia.com
http://www.enibague.com

Responder este comentario
problema con palabras omitidas Realizado por gabrielcz el Tuesday, October 03, 2006
Hola a todos, a ver, voy a l lio.
tengo algunos servidores y en uno con exito pude quitar algunas palabras del fichero noise.esn para que NO LAS OMITA.
Mi problema es que ahora, tengo un SQL en cluster con 4 instancias y en una de ellas me funciona y en otra no.
la historia es que tenemos que popular unos catalogos, pero con el fichero de palabras omitidas en BLANCO. (asi lo quieren, no hay posibilidad de afinar, los jefes asi lo quieren :()
la cuestion es igual, el problema es que edito el fichero (paro el MSSEARCH antes, sino no puedo manejarlo) edito quitando las palabras, vuelvo a generar el catalogo y lo lleno, me voy al transact, hago una consulta de por ejemplo "XX" (numero romano) y me dice que está omitida, y no entiendo, lo he generado despues de quitar todo, el fichero está vacio, pero aun asi sigue omitiendo TODAS las palabras.
Alguna idea, solucion o algo?
SQL2000 SP3 (EN OTRO servidor, mismo SP y misma instalacion si fucniona)
Un saludo.

Responder este comentario
HABILITAR EL FULLTEXT INDEX EN LA DB Realizado por DALSOM el Thursday, March 22, 2007
Buen dias.
En mi Enterprise Manager de Sql 2000, la opción FULLTEXT INDEX esta deshabilitada. He estado investigando, pero no he podido dar con el problema. Segun lo que me han comentado, es que debe especificarse en la instalación del Sql. Entiendo que esto debe ser configurable mediante menues o talvez , SP's .

Como lo habilito?

Gracias.

Responder este comentario
HABILITAR EL FULLTEXT INDEX EN LA DB Realizado por DALSOM el Thursday, March 22, 2007
Buen dias.
En mi Enterprise Manager de Sql 2000, la opción FULLTEXT INDEX esta deshabilitada. He estado investigando, pero no he podido dar con el problema. Segun lo que me han comentado, es que debe especificarse en la instalación del Sql. Entiendo que esto debe ser configurable mediante menues o talvez , SP's .

Como lo habilito?

Gracias.

Responder este comentario
Como Habilito esta opcion. Realizado por DALSOM el Thursday, March 22, 2007
Buen dia.
En mi Enterprise Manager de Sql 2000, la opción FULLTEXT INDEX esta deshabilitada. He estado investigando, pero no he podido dar con el problema. Segun lo que me han comentado, es que debe especificarse en la instalación del Sql. Entiendo que esto debe ser configurable mediante menues o talvez , SP's .

Como lo habilito?

Gracias.

Responder este comentario
Agregar comentarios
ISOFTLAND software corporativo