OVH Cloud OVH Cloud

Moteur de recherche SQL

5 réponses
Avatar
lobrys
Hello

Comment faire realiser un vrai moteur de recherche avec le FULLTEXT de SQL
SERVER?

en fait, j'aimerai que la recherche cherche a l'interieur des mots
indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,..... (si les 4
derniers sont contenus dans des champs indexés...)

pour info voila ma requete de recherche :

SELECT tbl_prod_key.RANK, p.produit_id
FROM product AS p
INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS tbl_prod_key ON
p.prod_id = tbl_prod_key.[KEY]
ORDER BY tbl_prod_key.RANK DESC

@prmStr est la requete que je donne .....

voila! merci
a+

syl

5 réponses

Avatar
Laurent Moreau
Voir aide en ligne de CONTAINS

Une requete du genre:

SELECT * FROM Latable WHERE CONTAINS(*, '"*bon*"')


Laurent.




"lobrys" wrote in message
news:ONEI%
Hello

Comment faire realiser un vrai moteur de recherche avec le FULLTEXT de SQL
SERVER?

en fait, j'aimerai que la recherche cherche a l'interieur des mots
indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,..... (si les


4
derniers sont contenus dans des champs indexés...)

pour info voila ma requete de recherche :

SELECT tbl_prod_key.RANK, p.produit_id
FROM product AS p
INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS tbl_prod_key ON
p.prod_id = tbl_prod_key.[KEY]
ORDER BY tbl_prod_key.RANK DESC

@prmStr est la requete que je donne .....

voila! merci
a+

syl




Avatar
lobrys
merci!
effectivement, je peux m'en servir......

sauf que ma requete c'est peut etre : "truc joe bidule"

faut que je fasse une boucle sur chaque mots dans ma requete SQL?
et ajouter les resultats de ta requete dans une table TEMP
comment je peux faire ca simplement?

a+
syl



"Laurent Moreau" a écrit dans le message
de news:ccgi56$qm$
Voir aide en ligne de CONTAINS

Une requete du genre:

SELECT * FROM Latable WHERE CONTAINS(*, '"*bon*"')


Laurent.




"lobrys" wrote in message
news:ONEI%
> Hello
>
> Comment faire realiser un vrai moteur de recherche avec le FULLTEXT de


SQL
> SERVER?
>
> en fait, j'aimerai que la recherche cherche a l'interieur des mots
> indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,..... (si


les
4
> derniers sont contenus dans des champs indexés...)
>
> pour info voila ma requete de recherche :
>
> SELECT tbl_prod_key.RANK, p.produit_id
> FROM product AS p
> INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS tbl_prod_key ON
> p.prod_id = tbl_prod_key.[KEY]
> ORDER BY tbl_prod_key.RANK DESC
>
> @prmStr est la requete que je donne .....
>
> voila! merci
> a+
>
> syl
>
>




Avatar
Laurent Moreau
Allez c'est mon jour de bonté, je prend la peine de t'écrire ça:
Il manque quelques controle, par exemple si la phrase est vide a
l'origine...


Laurent

---------------------------
CREATE PROCEDURE [dbo].[nom_proc]
@Phrase AS VarChar(8000)
AS

SET NOCOUNT ON

DECLARE @Req AS VarChar(8000)
DECLARE @PosEspace AS Integer

SET @Phrase=LTRIM(RTRIM(@Phrase)) -- vire les espaces devant et derriere

WHILE CHARINDEX(' ',@Phrase)>0 -- tant qu'il y a des espaces
BEGIN
SELECT @PosEspace=CHARINDEX(' ',@Phrase) -- position de l'espace ?
SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' + LEFT(@Phrase,
@PosEspace-1)+ '*"'')' -- ajoute OR si la requete n'est pas vide et ajoute
le CONTAINS
SET @Phrase=SUBSTRING(@Phrase,@PosEspace + 1 ,LEN(@Phrase) -
PosEspace) -- suite de la phrase apres l'espace
SET @Phrase=LTRIM(@Phrase) -- vire les espaces devant (pour pas avoir de
pb avec les doubles espaces
END
SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' +
REPLACE(@Phrase,'''','''''') + '*"'')' -- ajoute OR si la requete n'est pas
vide et ajoute le CONTAINS qui reste

SET @Req = 'SELECT * FROM MaTable WHERE ' + @Req -- fabrique le début de
la requete

SET NOCOUNT OFF

-- print @Req -- enlever les commentaires pour debugger
EXEC(@Req) -- exec de la requete
------------------------------











"lobrys" wrote in message
news:
merci!
effectivement, je peux m'en servir......

sauf que ma requete c'est peut etre : "truc joe bidule"

faut que je fasse une boucle sur chaque mots dans ma requete SQL?
et ajouter les resultats de ta requete dans une table TEMP
comment je peux faire ca simplement?

a+
syl



"Laurent Moreau" a écrit dans le


message
de news:ccgi56$qm$
> Voir aide en ligne de CONTAINS
>
> Une requete du genre:
>
> SELECT * FROM Latable WHERE CONTAINS(*, '"*bon*"')
>
>
> Laurent.
>
>
>
>
> "lobrys" wrote in message
> news:ONEI%
> > Hello
> >
> > Comment faire realiser un vrai moteur de recherche avec le FULLTEXT de
SQL
> > SERVER?
> >
> > en fait, j'aimerai que la recherche cherche a l'interieur des mots
> > indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,..... (si
les
> 4
> > derniers sont contenus dans des champs indexés...)
> >
> > pour info voila ma requete de recherche :
> >
> > SELECT tbl_prod_key.RANK, p.produit_id
> > FROM product AS p
> > INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS tbl_prod_key


ON
> > p.prod_id = tbl_prod_key.[KEY]
> > ORDER BY tbl_prod_key.RANK DESC
> >
> > @prmStr est la requete que je donne .....
> >
> > voila! merci
> > a+
> >
> > syl
> >
> >
>
>




Avatar
lobrys
alors ca! ca fait plaisir!!!!
merci COPAIN!

je vais étudier ca!

a+
et merci encore!

syl



"Laurent Moreau" a écrit dans le message
de news:ccj0ls$16n$
Allez c'est mon jour de bonté, je prend la peine de t'écrire ça:
Il manque quelques controle, par exemple si la phrase est vide a
l'origine...


Laurent

---------------------------
CREATE PROCEDURE [dbo].[nom_proc]
@Phrase AS VarChar(8000)
AS

SET NOCOUNT ON

DECLARE @Req AS VarChar(8000)
DECLARE @PosEspace AS Integer

SET @Phrase=LTRIM(RTRIM(@Phrase)) -- vire les espaces devant et derriere

WHILE CHARINDEX(' ',@Phrase)>0 -- tant qu'il y a des espaces
BEGIN
SELECT @PosEspace=CHARINDEX(' ',@Phrase) -- position de l'espace ?
SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' +


LEFT(@Phrase,
@PosEspace-1)+ '*"'')' -- ajoute OR si la requete n'est pas vide et ajoute
le CONTAINS
SET @Phrase=SUBSTRING(@Phrase,@PosEspace + 1 ,LEN(@Phrase) -
PosEspace) -- suite de la phrase apres l'espace
SET @Phrase=LTRIM(@Phrase) -- vire les espaces devant (pour pas avoir


de
pb avec les doubles espaces
END
SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' +
REPLACE(@Phrase,'''','''''') + '*"'')' -- ajoute OR si la requete n'est


pas
vide et ajoute le CONTAINS qui reste

SET @Req = 'SELECT * FROM MaTable WHERE ' + @Req -- fabrique le début de
la requete

SET NOCOUNT OFF

-- print @Req -- enlever les commentaires pour debugger
EXEC(@Req) -- exec de la requete
------------------------------











"lobrys" wrote in message
news:
> merci!
> effectivement, je peux m'en servir......
>
> sauf que ma requete c'est peut etre : "truc joe bidule"
>
> faut que je fasse une boucle sur chaque mots dans ma requete SQL?
> et ajouter les resultats de ta requete dans une table TEMP
> comment je peux faire ca simplement?
>
> a+
> syl
>
>
>
> "Laurent Moreau" a écrit dans le
message
> de news:ccgi56$qm$
> > Voir aide en ligne de CONTAINS
> >
> > Une requete du genre:
> >
> > SELECT * FROM Latable WHERE CONTAINS(*, '"*bon*"')
> >
> >
> > Laurent.
> >
> >
> >
> >
> > "lobrys" wrote in message
> > news:ONEI%
> > > Hello
> > >
> > > Comment faire realiser un vrai moteur de recherche avec le FULLTEXT


de
> SQL
> > > SERVER?
> > >
> > > en fait, j'aimerai que la recherche cherche a l'interieur des mots
> > > indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,.....


(si
> les
> > 4
> > > derniers sont contenus dans des champs indexés...)
> > >
> > > pour info voila ma requete de recherche :
> > >
> > > SELECT tbl_prod_key.RANK, p.produit_id
> > > FROM product AS p
> > > INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS


tbl_prod_key
ON
> > > p.prod_id = tbl_prod_key.[KEY]
> > > ORDER BY tbl_prod_key.RANK DESC
> > >
> > > @prmStr est la requete que je donne .....
> > >
> > > voila! merci
> > > a+
> > >
> > > syl
> > >
> > >
> >
> >
>
>




Avatar
Laurent Moreau
de rien...

en me relisant, je vois un truc pas tres net:

dans la boucle je ne double pas les '
LEFT(@Phrase,@PosEspace-1)

Tandis que je les double apres la boucle:
REPLACE(@Phrase,'''','''''')

je ne sais pas s'il faut les doubler: faire le test:
SELECT ... CONTAINS(*, '"*l'arbre*"')
ou
SELECT ... CONTAINS(*, '"*l''arbre*"')


S'il faut les doubler (je pense qu'il faut), il faut modifier dans la
boucle:

REPLACE(LEFT(@Phrase,@PosEspace-1),'''','''''')



Laurent.




"lobrys" wrote in message
news:%
alors ca! ca fait plaisir!!!!
merci COPAIN!

je vais étudier ca!

a+
et merci encore!

syl



"Laurent Moreau" a écrit dans le


message
de news:ccj0ls$16n$
> Allez c'est mon jour de bonté, je prend la peine de t'écrire ça:
> Il manque quelques controle, par exemple si la phrase est vide a
> l'origine...
>
>
> Laurent
>
> ---------------------------
> CREATE PROCEDURE [dbo].[nom_proc]
> @Phrase AS VarChar(8000)
> AS
>
> SET NOCOUNT ON
>
> DECLARE @Req AS VarChar(8000)
> DECLARE @PosEspace AS Integer
>
> SET @Phrase=LTRIM(RTRIM(@Phrase)) -- vire les espaces devant et


derriere
>
> WHILE CHARINDEX(' ',@Phrase)>0 -- tant qu'il y a des espaces
> BEGIN
> SELECT @PosEspace=CHARINDEX(' ',@Phrase) -- position de l'espace ?
> SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' +
LEFT(@Phrase,
> @PosEspace-1)+ '*"'')' -- ajoute OR si la requete n'est pas vide et


ajoute
> le CONTAINS
> SET @Phrase=SUBSTRING(@Phrase,@PosEspace + 1 ,LEN(@Phrase) -
> PosEspace) -- suite de la phrase apres l'espace
> SET @Phrase=LTRIM(@Phrase) -- vire les espaces devant (pour pas avoir
de
> pb avec les doubles espaces
> END
> SET @Req = COALESCE(@Req + ' OR ', '') + 'CONTAINS(*, ''"*' +
> REPLACE(@Phrase,'''','''''') + '*"'')' -- ajoute OR si la requete n'est
pas
> vide et ajoute le CONTAINS qui reste
>
> SET @Req = 'SELECT * FROM MaTable WHERE ' + @Req -- fabrique le début


de
> la requete
>
> SET NOCOUNT OFF
>
> -- print @Req -- enlever les commentaires pour debugger
> EXEC(@Req) -- exec de la requete
> ------------------------------
>
>
>
>
>
>
>
>
>
>
>
> "lobrys" wrote in message
> news:
> > merci!
> > effectivement, je peux m'en servir......
> >
> > sauf que ma requete c'est peut etre : "truc joe bidule"
> >
> > faut que je fasse une boucle sur chaque mots dans ma requete SQL?
> > et ajouter les resultats de ta requete dans une table TEMP
> > comment je peux faire ca simplement?
> >
> > a+
> > syl
> >
> >
> >
> > "Laurent Moreau" a écrit dans le
> message
> > de news:ccgi56$qm$
> > > Voir aide en ligne de CONTAINS
> > >
> > > Une requete du genre:
> > >
> > > SELECT * FROM Latable WHERE CONTAINS(*, '"*bon*"')
> > >
> > >
> > > Laurent.
> > >
> > >
> > >
> > >
> > > "lobrys" wrote in message
> > > news:ONEI%
> > > > Hello
> > > >
> > > > Comment faire realiser un vrai moteur de recherche avec le


FULLTEXT
de
> > SQL
> > > > SERVER?
> > > >
> > > > en fait, j'aimerai que la recherche cherche a l'interieur des mots
> > > > indexés.... BON pourra me rendre BON, BONNE, BONJOUR, JAMBON,.....
(si
> > les
> > > 4
> > > > derniers sont contenus dans des champs indexés...)
> > > >
> > > > pour info voila ma requete de recherche :
> > > >
> > > > SELECT tbl_prod_key.RANK, p.produit_id
> > > > FROM product AS p
> > > > INNER JOIN FREETEXTTABLE (product, *, @prmStr ) AS
tbl_prod_key
> ON
> > > > p.prod_id = tbl_prod_key.[KEY]
> > > > ORDER BY tbl_prod_key.RANK DESC
> > > >
> > > > @prmStr est la requete que je donne .....
> > > >
> > > > voila! merci
> > > > a+
> > > >
> > > > syl
> > > >
> > > >
> > >
> > >
> >
> >
>
>