Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Dim Mai 05, 2013 15:09 Sujet du message: Moteur de recherche |
|
|
Bonjour,
J'ai ajouté un moteur de recherche pour le site (menu de gauche), il scanne le contenu des fichiers PDF.
J'ai pour l'instant indexé la chrono de 1940 et 1941, la chrono de 1942 et les annexes suivront.
Cet outil est pour l'instant rudimentaire, il ne traite qu'un seul mot entier (pas de partie d'un mot). Pas de différence majuscules/minuscules.
Il est possible que je définisse une liste de mots à exclure de la recherche (articles, prépositions, verbes élémentaires, etc).
Merci à tous de me donner votre avis dans ce sujet : rapidité, présentation, éventuelles erreurs de recherche, ...
Attention, le forum conserve son propre moteur de recherche. _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
Thomas27
Inscrit le: 13 Avr 2013 Messages: 664 Localisation: Lyon
|
|
Revenir en haut de page |
|
|
Capu Rossu
Inscrit le: 22 Oct 2011 Messages: 2554 Localisation: Mittlemeerküstenfront
|
Posté le: Dim Mai 05, 2013 21:14 Sujet du message: |
|
|
Bonsoir,
Citation: | J'ai ajouté un moteur de recherche pour le site (menu de gauche), il scanne le contenu des fichiers PDF. |
Je ne le trouve pas.
@+
Alain |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Lun Mai 06, 2013 07:33 Sujet du message: |
|
|
Menu de gauche du site, entre "Images" et "Forum" : une bête zone de saisie, on tape Entrée et zou ! _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
Capu Rossu
Inscrit le: 22 Oct 2011 Messages: 2554 Localisation: Mittlemeerküstenfront
|
Posté le: Lun Mai 06, 2013 08:39 Sujet du message: |
|
|
Bonjour,
Allo, Monsieur l'Opticien ! c'est-y quand que vous me les faites mes nouvelles bésicles ?
OK, vu la bête.
Merci
Alain |
|
Revenir en haut de page |
|
|
sting01
Inscrit le: 30 Juil 2010 Messages: 1450 Localisation: Thailande
|
Posté le: Mar Mai 07, 2013 07:17 Sujet du message: |
|
|
Est ce avec Mysql?
Il se trouve que je suis entrain de faire une chose similaire au boulot (referencer les localisation,telles que ville, districts, departements, regions, pays) de tout les hotels que nous avons en stock (250 000 acejour). Cela dans le but de faciliter la recherche de nos clients.
Donc je dois accepter des requetes du genre : hotels phuket et retrourner une liste (10) d'hotels, mais aussi Martinez Cannes, hotel Martinez, hotel croisette ou hotelS croisette; voire meme hotel croisete ...
Objectivement a full search sera trop longue, reponses doivent revenir dans les 500 ms (le temps pris par internet etant inclus dans les 50 ms!).
Donc si je puis te donner un conseil, tu devrais dans un premier temps utilise un 'index inverse'; puis lorsque cela fonctionera, la seconde etape sera un 'map reduce'.
cherche sur wikipedia :
http://en.wikipedia.org/wiki/Index_(search_engine)
C'et en anglais, et c'est voulu, car il y plus d'informations et de liens sur cette page. Cela te donne une bonne idee de comment proceder (la fersion logique).
Le map reduce peut etre trouve sur wiki aussi, je te conseille aussi cette page :
http://blog.cloudera.com/wp-content/uploads/2010/01/5-MapReduceAlgorithms.pdf
cela te donne une idee du genre d'algorithme a utiliser
celle ci est un peu plus detaillee :
http://highlyscalable.wordpress.com/2012/02/01/mapreduce-patterns/
A savoir que ces methodes sont celles utilisees par Google (patentee par google devrais je dire) donc supportent des qunatites de donnees qui sont a des magnitudes plus elevees que celle de FTL (imagine le nombre de mot dans les bases de donnees google!!!!!).
En cas de besoin , contacte moi.
La maniere que j;ai adopte pour resoudre mon probleme a ete :
1) separes tout les noms (pays, regions, villes, hotels) en un mot (Kuala Lumpur donnant donc 2 mots);
2) inserer dans une table ce mot avec l'id de reference et un bit specificiant le niveau (hotel, district, region, departement, pays ...)
A cepoint, 30 000 000 de lignes dans la table, reponse en moyenne a moins d'une seconde (mais 6 sec si une personne tape HOT, car c'et l'occurence la plus frequente, 1 500 000 lignes commence par HOT)
Ce construct est appele un ' FORWARD INDEX' c'est actuellement ce que nos clients utilise.
En preparation (car j;ai d'autres taches) :
3) creer une nouvelle table, utilisant le 'inverted index' (done).
4) la remplir avec cette query :
INSERT INTO inverted_index (search_named, inverted_index) )SELECT search_named,GROUP_CONCAT(DISTINCT CONCAT('(',CONCAT_WS(',', id_src_non_hotel,total),')') ORDER BY id_src_non_hotel ASC) FROM search_name3 GROUP BY search_named)
(done).
cela me donne 350 000 lignes (100 fois moindre).
Il ne me reste plus qu'a trouver une bonne solution pour reduire la taille des reponses( j;ai une idee mais pas encore testee).
Point crucial :
la recherche doit etre :
SELECT * FROM your_table WHERE mot LIKE 'abc%';
Remarques STP qu'il n;y a pas de signe % a gauche, donc on utilise les index.
Autre point encore plus crucial :
lorsque tout est prete , tu dois :
1) Optimize table your_table (enlever une partie du overhead)
2) ALTER TABLE your_table ORDER BY searchable_column ASC;
Cela va eviter les I/O bottlenecks.
Desole pour le franglais, mais je pense en anglais desqu'il s'agit de DB.
N'hesite pas, j;ai peut etre la solution dont tu reves depuis longtemps (joke).
Eric _________________ La can can-can, cancouillote,
c'est pas fait pour les francois.
Anscarides je suis ne,
heritier de la Comte je serai. |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Mar Mai 07, 2013 07:34 Sujet du message: |
|
|
Pour faire court : oui il y a une BDD MySQL, je dois encore m'occuper des index. J'en reparle tout à l'heure. _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Jeu Mai 09, 2013 09:39 Sujet du message: |
|
|
Le "tout à l'heure" ayant quelque peu dérapé , voici quelques infos : le moteur est basé sur une base de de données MySQL alimentée et consultée par PHP.
2 tables :
- fichiers : chaque ligne correspond à un fichier, avec un numéro unique, son emplacement et la date de dernière indexation ; actuellement 258 enregistrements ; pas d'index nécessaire sur cette table
- mots : chaque ligne correspond à un mot avec le numéro du fichier dans lequel il figure (un mot apparaît sur plusieurs lignes s'il est dans plusieurs fichiers) ; actuellement 438759 enregistrements, soit 57604 mots uniques, mais il y a probablement du ménage à faire ; les champs sont indexés.
Je n'ai pas filtré sur les mots communs (articles, prépositions, verbes courants, etc) comme le font certains moteurs de recherche, cela peut encore changer.
J'ai indexé la chrono de 1942 (janvier - août). _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
sting01
Inscrit le: 30 Juil 2010 Messages: 1450 Localisation: Thailande
|
Posté le: Ven Mai 10, 2013 05:02 Sujet du message: |
|
|
loic a écrit: | Le "tout à l'heure" ayant quelque peu dérapé , voici quelques infos : le moteur est basé sur une base de de données MySQL alimentée et consultée par PHP.
2 tables :
- fichiers : chaque ligne correspond à un fichier, avec un numéro unique, son emplacement et la date de dernière indexation ; actuellement 258 enregistrements ; pas d'index nécessaire sur cette table
- mots : chaque ligne correspond à un mot avec le numéro du fichier dans lequel il figure (un mot apparaît sur plusieurs lignes s'il est dans plusieurs fichiers) ; actuellement 438759 enregistrements, soit 57604 mots uniques, mais il y a probablement du ménage à faire ; les champs sont indexés.
Je n'ai pas filtré sur les mots communs (articles, prépositions, verbes courants, etc) comme le font certains moteurs de recherche, cela peut encore changer.
J'ai indexé la chrono de 1942 (janvier - août). |
Donc tu as ton "forward index", ce que tu devrais faire est de construire ton "inverted index" (desole pour les noms en anglais, je ne connais pas ceux en francais).
disons actuellement tu as :
bat 1526
bat 268
bat 99999
d'af 1526
d'af 8888
d'af 1234
d'af 268
ce que tu dois avoir (inverted index) est :
bat 1526,268,99999
d'af 1526,8888, 1234,268
lorsque une personne va chercher pour bat d'af, tu vas retrouver 2 lines (1 par mot), et tu vas simplement (Php a une function pour ela) croiser les deux resultats (mis auparavant dans array, avec mysql_fetch_array() ).
voila la requete MYSQL que j'utilise (a toi de modifier les nom de colomnes et de tables) :
requetes de verification :
SELECT search_named,GROUP_CONCAT(DISTINCT CONCAT('(',CONCAT_WS(',', id_src_non_hotel,total),')')) FROM search_name3 GROUP BY search_named
cela prend une poignee de secondes.
si le resultat te convient, cree une nouvelle table et run cela :
INSERT INTO inverted_index (search_named, inverted_index) )SELECT search_named,GROUP_CONCAT(DISTINCT CONCAT('(',CONCAT_WS(',', id_src_non_hotel,total),')') ORDER BY id_src_non_hotel ASC) FROM search_name3 GROUP BY search_named)
maintenat, GROUP_CONCAT a une limitation, donc je te suggeres de la supprimer (pour cette session seulement) :
SET SESSION group_concat_max_len = 100000000;
SET SESSION max_allowed_packet = 100000000;
INSERT INTO inverted_index (search_named, inverted_index) (SELECT search_named,GROUP_CONCAT(DISTINCT CONCAT('(',CONCAT_WS(',', substring(id_src_non_hotel,total, ' ' , 1 )),')') ORDER BY id_src_non_hotel ASC) FROM search_name3 GROUP BY search_named)
et voila
Maintenat nous pouvons faire de la recherche multi mot, aussi rapide (si ce n'est plus) que google (car moins de lines dans la DB!).
A noter que ici, le 'map - reduce ' algorithme (what a bitch it is!) est simplement trnsferer a MYSQL pour le bief de GROUP_CONCAT avec le relevant GROUP BY.
Ceci est une patente deposee par google inc; donc pour aussi simple que cela semble il n'en est pas moins de l'informatique de tres haut niveau. _________________ La can can-can, cancouillote,
c'est pas fait pour les francois.
Anscarides je suis ne,
heritier de la Comte je serai. |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Ven Mai 10, 2013 12:52 Sujet du message: |
|
|
Mmh, j'avais pensé à stocker la liste des fichiers pour un même mot, mais le gain ne me semble pas énorme, les requêtes sont actuellement assez rapides.
Non, le vrai enjeu serait de pouvoir rechercher des expressions (ex : "Charles de Gaulle"), mais ceci oblige à stocker le texte entier du fichier dans la BDD. _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
sting01
Inscrit le: 30 Juil 2010 Messages: 1450 Localisation: Thailande
|
Posté le: Ven Mai 10, 2013 21:22 Sujet du message: |
|
|
loic a écrit: | Mmh, j'avais pensé à stocker la liste des fichiers pour un même mot, mais le gain ne me semble pas énorme, les requêtes sont actuellement assez rapides.
Non, le vrai enjeu serait de pouvoir rechercher des expressions (ex : "Charles de Gaulle"), mais ceci oblige à stocker le texte entier du fichier dans la BDD. |
Oui, c'est cela quidoit etre fait _________________ La can can-can, cancouillote,
c'est pas fait pour les francois.
Anscarides je suis ne,
heritier de la Comte je serai. |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Dim Nov 03, 2013 12:45 Sujet du message: |
|
|
Le moteur de recherche du site sera indisponible cet aprem pour cause de maintenance. _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Sam Nov 09, 2013 09:12 Sujet du message: |
|
|
Il reste un bug concernant les accents. Si je recherche le mot "traité", un fichier peut sortir deux fois, pour "traité" et "traite" (sans accent). Je réfléchis à supprimer les accents de la base de données, ce qui permet de trouver certains noms exotiques, étant donné que notre rédac-chef met un point d'honneur à se conformer aux noms étrangers (exemple : Hiyô pour le porte-avions japonais). _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
sting01
Inscrit le: 30 Juil 2010 Messages: 1450 Localisation: Thailande
|
Posté le: Lun Nov 11, 2013 04:13 Sujet du message: |
|
|
loic a écrit: | Il reste un bug concernant les accents. Si je recherche le mot "traité", un fichier peut sortir deux fois, pour "traité" et "traite" (sans accent). Je réfléchis à supprimer les accents de la base de données, ce qui permet de trouver certains noms exotiques, étant donné que notre rédac-chef met un point d'honneur à se conformer aux noms étrangers (exemple : Hiyô pour le porte-avions japonais). |
Supposant que tu utilise Mysql utf-8, tu remarqueras que si tu fais un ORDER BY 'traité'; ce dernier sera toujours en tete. Inversement si tu fais un ORDER BY 'traite'; ce dernier sera en tete.
Cela assume que ta colone ayant le texte a elle meme une collation (qui peut etre ou ne pas etre la meme que la collation de ta table.).
Donc ce que je fais au boulot :
SELECT * FROM ( SELECT t1.country,t1.subregion,t1.district,t1.hotel, t1.total, t1.search_id,t1.subregion_id as id, t1.continent_id FROM v2_src_non_hotel_en as t1 WHERE t1.search_id = 'c10_s46' AND (country LIKE 'singapor%' OR subregion LIKE 'singapor%' OR district LIKE 'singapor%') AND t1.level <> 'continent' AND t1.total >0 UNION SELECT t1.country,t1.subregion,t1.district,t1.hotel, t1.total, t1.search_id,t1.subregion_id as id, t1.continent_id FROM v2_src_non_hotel_en as t1 WHERE t1.search_id = 'c10_s46' AND (country LIKE 'airpo%' OR subregion LIKE 'airpo%' OR district LIKE 'airpo%') AND t1.level <> 'continent' AND t1.total >0 )as s ORDER BY 'airpo' LIMIT 1;
Cela permets de trouver l'aeroport de singapour , qui n'existe pas dans notre base de donnees (c'est Changi, mais dans la subregion singapore). Le ORDER BY permet de differencier pour des villes comme Koln, Köln, ou Køln (danois), et de proposer le resultat attendu (assumant qu;il existe).
Donc ORDER BY (param envoye par l'utilisateur).
Et sois certain que la collation est donnee sur la colonne (en plus de la colation de la table).
En esperant que cela aide! (sinon PM moi). _________________ La can can-can, cancouillote,
c'est pas fait pour les francois.
Anscarides je suis ne,
heritier de la Comte je serai. |
|
Revenir en haut de page |
|
|
loic Administrateur - Site Admin
Inscrit le: 16 Oct 2006 Messages: 9008 Localisation: Toulouse (à peu près)
|
Posté le: Mar Nov 12, 2013 09:00 Sujet du message: |
|
|
Merci pour les infos, cela recoupe ce que j'avais déduit de la doc MySQL. _________________ On ne trébuche pas deux fois sur la même pierre (proverbe oriental)
En principe (moi) ... |
|
Revenir en haut de page |
|
|
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|
|