0

Contexte du problèmeLa mise en œuvre d'un Document de recherche moteur


Bonjour à tous, je travaillais sur un projet de recherche de documents pertinents dans un tas de documents en fonction de la requête fournie. Comme il s'agit d'un mini projet et que j'ai une architecture mémoire typique, je suppose que je n'ai pas plus de 100 documents et que chaque document ne contient pas plus de 1000 mots (un mot ne compte pas plus de 10 caractères). Je reçois beaucoup de requêtes et je dois traiter les requêtes aussi vite que possible (certainement pas plus d'une seconde).

Ma première approche (Naive et non évolutive):


Comme les utilisateurs sont autorisés à télécharger des documents, chaque fois que je reçois un document, je cherche des mots-clés « potentiels » et les mots clés du magasin comme clé et documenter en tant que paire de valeurs ou dans une table MYSQL. Clairement, cela doit être fait manuellement et ne ressemble pas beaucoup à ce que les programmeurs feraient.

Ma deuxième approche (un peu mieux):


Je prends chaque document, analyser chaque mot et ajouter ce mot à une structure de données Trie, donc pour 100 documents que je dois rechercher 100 Teste et si la requête a une longueur de 1, cette approche prendra le pire O (Nombre de mots sur tous les documents * longueur du mot le plus grand) pour construire le trie et interroger O (longueur de la requête). C'est plutôt raisonnable. Pour mettre en œuvre ceci, je garderais un vecteur de nœuds racines de Trie dans chaque document et je parcourrais chaque nœud et je ferais une recherche dans chaque nœud. Si au moins la moitié des mots de la requête correspondent, je stocke ce document comme résultat potentiel. Je ne donnerai pas plus qu'un nombre limité de documents comme résultat.

Ma question communautaire:


Je demanderais que pensez-vous de mes approches? Comment puis-je les optimiser, quelles autres améliorations puis-je faire dans les approches existantes? Cela peut-il être fait plus efficacement en utilisant d'autres algorithmes ou une structure de données? Surfer sur le web J'ai rencontré des algorithmes comme Boyer-Moore et Aho-Corasick et quelques suggestions pour modifier les algorithmes implémentés par Lucene Apache. Que suggérez-vous ici?

+0

Jetez un coup d'œil à [elasticsearch] (https://www.elastic.co/). Il est extrêmement évolutif et devrait parfaitement s'adapter à votre projet. – CaptainTrunky

+0

@CaptainTrunky, s'il vous plaît, je ne veux pas utiliser la bibliothèque, l'objectif de ce projet est de le faire moi-même. Il serait utile pour moi si vous pouviez dire quel est le noyau de la recherche élastique. –

+0

Pour 100 documents de 1000 mots chacun et 1 requête par seconde, grep devrait suffire. Si vous insistez sur une stratégie d'indexation quelconque, conservez une liste de paires (mot, ensemble de documents) triées par mot et binaire. Cela pourrait simplement être un fichier. –

Répondre

0

La façon la plus simple de mettre en œuvre la recherche en texte intégral est la construction d'un document correspondant inverted index et de rang avec des paramètres comme TF-IDF

Alors que de nouveaux documents viennent, vous extraire les mots dans le document et ajouter le document à votre index inversé . Lorsqu'une requête arrive, vous trouvez un document correspondant dans l'index et effectuez un tri basé sur TF-IDF (ou sur d'autres métriques qui vous intéressent). Vous renvoyez ensuite k documents les mieux classés en résultat de la requête. Au-delà, il y a des tonnes de recherches dans le domaine Information Retrieval qui rendent l'opération plus efficace, tout en améliorant les résultats (document top-k).