con fulltex ? y como se hace, o como se puede

21/05/2004 - 01:31 por MajorTom | Informe spam
Hola,

Quisiera algun consego de la mejor forma de indexar y hacer una busqueda
segun el modelo que me explico a continuacion:

En el campo que deseo buscar es un "char" de 14 posiciones (o cualquier otro
que me recomienden) y tendra valores desde una posicion hasta las 14, la
cantidad de filas es inicialmente de mas de 5000 y en algun futuro podria
llegar hasta unos 400,000.

Los valores de este campo son un subconjunto o una parte de la referencia de
busqueda ejemplo:

01166041234 es el dato a buscar y en la tabla hay filas que tendran una
parte del mismo, las filas que quiero encontar son aquellas que tengan la
mayor cantidad de caracteres iguales, esto es si hay una fila con el 1166
otra 116604, la fila que deseo que retorne es la que tiene el 116604 (tomar
en cuenta que salte el 0 inicial, pudiera ser desde cualquier posicion).

Estoy programando desde C# y pudiera hacer un ciclo para este proceso, pero
prefiero si es posible ejecutar la busqueda por una sentencia SQL y operar
con el dataset que me retorne SQL

Espero que no sea una pregunta FAQ o tonta, pues es mi primer intento en
algo similar y en este grupo.

Desde ya muchas gracias.

MajorTom

Preguntas similare

Leer las respuestas

#1 Maximiliano Damian Accotto
21/05/2004 - 02:45 | Informe spam
Hola amigo!! revisate este link

http://www.mug.org.ar/SQL/ArticSQL/237.aspx

Bye


Salu2

Maximiliano Damian Accotto
Gerente de IT
Fundicion San Cayetano S.A.
Buenos Aires Argentina
-
maxi_accotto[arroba]speedy[.]com[.].ar
MSN:



"MajorTom" escribió en el mensaje
news:
Hola,

Quisiera algun consego de la mejor forma de indexar y hacer una busqueda
segun el modelo que me explico a continuacion:

En el campo que deseo buscar es un "char" de 14 posiciones (o cualquier


otro
que me recomienden) y tendra valores desde una posicion hasta las 14, la
cantidad de filas es inicialmente de mas de 5000 y en algun futuro podria
llegar hasta unos 400,000.

Los valores de este campo son un subconjunto o una parte de la referencia


de
busqueda ejemplo:

01166041234 es el dato a buscar y en la tabla hay filas que tendran una
parte del mismo, las filas que quiero encontar son aquellas que tengan la
mayor cantidad de caracteres iguales, esto es si hay una fila con el 1166
otra 116604, la fila que deseo que retorne es la que tiene el 116604


(tomar
en cuenta que salte el 0 inicial, pudiera ser desde cualquier posicion).

Estoy programando desde C# y pudiera hacer un ciclo para este proceso,


pero
prefiero si es posible ejecutar la busqueda por una sentencia SQL y operar
con el dataset que me retorne SQL

Espero que no sea una pregunta FAQ o tonta, pues es mi primer intento en
algo similar y en este grupo.

Desde ya muchas gracias.

MajorTom


Respuesta Responder a este mensaje
#2 Javier Loria
21/05/2004 - 07:35 | Informe spam
Hola:
Antes de iniciar:
a) Este definitivamente no es una pregunta FAQ y mucho menos tonta.
b) SQL no esta disenado para resolver este tipo de problemas, pero puede
hacerlo.
c) No creo que Index Server te ayude con esto.
Una vez sacado esto de mi sistema, te comento como lo resolveria.
Primero hay que generar los segmentos de la llave ('01166041234') en un
conjunto de datos donde cada segmento sea una fila. Esto lo puedes lograr si
te ayudas con una tabla de numeros.
=CREATE TABLE Numeros(
Numero INT NOT NULL
PRIMARY KEY)
GO
INSERT Numeros(Numero)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
...
SELECT 14
= En este caso debes tener por lo menos 14 numeros. Luego puedes hacer una
funcion en linea que traduzca la llave a un conjunto de datos:
=CREATE FUNCTION LlavesParciales(@Llave VARCHAR(14))
RETURNS TABLE
AS
RETURN SELECT DISTINCT SUBSTRING(@Llave
, Inicio.Numero, Largo.Numero) AS Llave
FROM Numeros AS Inicio
CROSS JOIN Numeros AS Largo
WHERE Inicio.Numero+Largo.Numero
BETWEEN 2 AND LEN(@Llave)+1
GO
SELECT * FROM dbo.LlavesParciales('01166041234')
= Una vez que tienes esta funcion es cuestion de usar un join entre la
tabla en cuestion y esta funcion para obtener los valores de mayor largo.
Esto lo haces con algo como:
=SELECT TOP 1 WITH TIES Llaves.Llave
FROM Llaves
JOIN LlavesParciales('01166041234') AS LlaveP
ON Llaves.Llave=LlaveP.Llave
ORDER BY LEN(Llaves.Llave) DESC
= Espero que eso sea lo que necesitas, en cuanto al diseno fisico de la
tabla que tiene las llaves, creo que no usara indices y probablemente haga
un TABLE SCAN siempre. Eventualmente si esta tabla tiene filas grandes (la
suma de los bytes que gasta en cada columna), entonces probablemente lo
mejor sera crearle un INDICE NO CLUSTERED, para accelerar la consulta, pero
la verdad no estoy seguro.
No creo que sea rapido, pero apostaria a que es mas rapido que C#. Si
haces pruebas de desempeno agradeceria mucho que las postearas al grupo para
aprender.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
MajorTom escribio:
Hola,

Quisiera algun consego de la mejor forma de indexar y hacer una
busqueda segun el modelo que me explico a continuacion:

En el campo que deseo buscar es un "char" de 14 posiciones (o
cualquier otro que me recomienden) y tendra valores desde una
posicion hasta las 14, la cantidad de filas es inicialmente de mas de
5000 y en algun futuro podria llegar hasta unos 400,000.

Los valores de este campo son un subconjunto o una parte de la
referencia de busqueda ejemplo:

01166041234 es el dato a buscar y en la tabla hay filas que tendran
una parte del mismo, las filas que quiero encontar son aquellas que
tengan la mayor cantidad de caracteres iguales, esto es si hay una
fila con el 1166 otra 116604, la fila que deseo que retorne es la que
tiene el 116604 (tomar en cuenta que salte el 0 inicial, pudiera ser
desde cualquier posicion).

Estoy programando desde C# y pudiera hacer un ciclo para este
proceso, pero prefiero si es posible ejecutar la busqueda por una
sentencia SQL y operar con el dataset que me retorne SQL

Espero que no sea una pregunta FAQ o tonta, pues es mi primer intento
en algo similar y en este grupo.

Desde ya muchas gracias.

MajorTom
Respuesta Responder a este mensaje
#3 MajorTom
21/05/2004 - 12:46 | Informe spam
Gracias, estare estudiando esto y comentare luego

MajorTom

"Javier Loria" wrote in message
news:
Hola:
Antes de iniciar:
a) Este definitivamente no es una pregunta FAQ y mucho menos tonta.
b) SQL no esta disenado para resolver este tipo de problemas, pero


puede
hacerlo.
c) No creo que Index Server te ayude con esto.
Una vez sacado esto de mi sistema, te comento como lo resolveria.
Primero hay que generar los segmentos de la llave ('01166041234') en un
conjunto de datos donde cada segmento sea una fila. Esto lo puedes lograr


si
te ayudas con una tabla de numeros.
=> CREATE TABLE Numeros(
Numero INT NOT NULL
PRIMARY KEY)
GO
INSERT Numeros(Numero)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
...
SELECT 14
=> En este caso debes tener por lo menos 14 numeros. Luego puedes hacer


una
funcion en linea que traduzca la llave a un conjunto de datos:
=> CREATE FUNCTION LlavesParciales(@Llave VARCHAR(14))
RETURNS TABLE
AS
RETURN SELECT DISTINCT SUBSTRING(@Llave
, Inicio.Numero, Largo.Numero) AS Llave
FROM Numeros AS Inicio
CROSS JOIN Numeros AS Largo
WHERE Inicio.Numero+Largo.Numero
BETWEEN 2 AND LEN(@Llave)+1
GO
SELECT * FROM dbo.LlavesParciales('01166041234')
=> Una vez que tienes esta funcion es cuestion de usar un join entre la
tabla en cuestion y esta funcion para obtener los valores de mayor largo.
Esto lo haces con algo como:
=> SELECT TOP 1 WITH TIES Llaves.Llave
FROM Llaves
JOIN LlavesParciales('01166041234') AS LlaveP
ON Llaves.Llave=LlaveP.Llave
ORDER BY LEN(Llaves.Llave) DESC
=> Espero que eso sea lo que necesitas, en cuanto al diseno fisico de la
tabla que tiene las llaves, creo que no usara indices y probablemente haga
un TABLE SCAN siempre. Eventualmente si esta tabla tiene filas grandes (la
suma de los bytes que gasta en cada columna), entonces probablemente lo
mejor sera crearle un INDICE NO CLUSTERED, para accelerar la consulta,


pero
la verdad no estoy seguro.
No creo que sea rapido, pero apostaria a que es mas rapido que C#. Si
haces pruebas de desempeno agradeceria mucho que las postearas al grupo


para
aprender.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
MajorTom escribio:
> Hola,
>
> Quisiera algun consego de la mejor forma de indexar y hacer una
> busqueda segun el modelo que me explico a continuacion:
>
> En el campo que deseo buscar es un "char" de 14 posiciones (o
> cualquier otro que me recomienden) y tendra valores desde una
> posicion hasta las 14, la cantidad de filas es inicialmente de mas de
> 5000 y en algun futuro podria llegar hasta unos 400,000.
>
> Los valores de este campo son un subconjunto o una parte de la
> referencia de busqueda ejemplo:
>
> 01166041234 es el dato a buscar y en la tabla hay filas que tendran
> una parte del mismo, las filas que quiero encontar son aquellas que
> tengan la mayor cantidad de caracteres iguales, esto es si hay una
> fila con el 1166 otra 116604, la fila que deseo que retorne es la que
> tiene el 116604 (tomar en cuenta que salte el 0 inicial, pudiera ser
> desde cualquier posicion).
>
> Estoy programando desde C# y pudiera hacer un ciclo para este
> proceso, pero prefiero si es posible ejecutar la busqueda por una
> sentencia SQL y operar con el dataset que me retorne SQL
>
> Espero que no sea una pregunta FAQ o tonta, pues es mi primer intento
> en algo similar y en este grupo.
>
> Desde ya muchas gracias.
>
> MajorTom


Respuesta Responder a este mensaje
#4 MajorTom
21/05/2004 - 12:47 | Informe spam
gracias, de mucha ayuda para mi...

MajorTom

"Maximiliano Damian Accotto" wrote in
message news:
Hola amigo!! revisate este link

http://www.mug.org.ar/SQL/ArticSQL/237.aspx

Bye


Salu2

Maximiliano Damian Accotto
Gerente de IT
Fundicion San Cayetano S.A.
Buenos Aires Argentina
-
maxi_accotto[arroba]speedy[.]com[.].ar
MSN:



"MajorTom" escribió en el mensaje
news:
> Hola,
>
> Quisiera algun consego de la mejor forma de indexar y hacer una busqueda
> segun el modelo que me explico a continuacion:
>
> En el campo que deseo buscar es un "char" de 14 posiciones (o cualquier
otro
> que me recomienden) y tendra valores desde una posicion hasta las 14, la
> cantidad de filas es inicialmente de mas de 5000 y en algun futuro


podria
> llegar hasta unos 400,000.
>
> Los valores de este campo son un subconjunto o una parte de la


referencia
de
> busqueda ejemplo:
>
> 01166041234 es el dato a buscar y en la tabla hay filas que tendran una
> parte del mismo, las filas que quiero encontar son aquellas que tengan


la
> mayor cantidad de caracteres iguales, esto es si hay una fila con el


1166
> otra 116604, la fila que deseo que retorne es la que tiene el 116604
(tomar
> en cuenta que salte el 0 inicial, pudiera ser desde cualquier posicion).
>
> Estoy programando desde C# y pudiera hacer un ciclo para este proceso,
pero
> prefiero si es posible ejecutar la busqueda por una sentencia SQL y


operar
> con el dataset que me retorne SQL
>
> Espero que no sea una pregunta FAQ o tonta, pues es mi primer intento en
> algo similar y en este grupo.
>
> Desde ya muchas gracias.
>
> MajorTom
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida