Je construis un site Django et je recherche un moteur de recherche.
Quelques candidats:
Lucene / Lucene avec Compass / Solr
Sphinx
Postgresql recherche en texte intégral intégrée
MySQl intégré à la recherche en texte intégral
Les critères de sélection:
Toute personne ayant déjà expérimenté les moteurs de recherche ci-dessus ou d’autres moteurs ne figurant pas dans la liste – j’aimerais entendre vos opinions.
EDIT: Comme pour les besoins d’indexation, lorsque les utilisateurs continuent à saisir des données sur le site, ces données doivent être indexées en permanence. Cela ne doit pas nécessairement être en temps réel, mais idéalement, les nouvelles données devraient apparaître dans l’index avec un délai de 15 à 30 minutes maximum.
C’est bon de voir quelqu’un parler de Lucene – parce que je n’en ai aucune idée.
Sphinx, par contre, je sais très bien, alors voyons si je peux être utile.
Je n’ai aucune idée de la façon dont il est applicable à votre situation, mais Evan Weaver a comparé quelques-unes des options de recherche courantes de Rails (Sphinx, Ferret (un port de Lucene pour Ruby) et Solr), exécutant des tests de performances. Pourrait être utile, je suppose.
Je ne suis pas au fait des recherches en texte intégral de MySQL, mais je sais que Sphinx, Lucene ou Solr ne sont pas compétitifs.
Je ne connais pas Sphinx, mais comme pour Lucene vs une recherche en texte intégral dans une firebase database, je pense que les performances de Lucene sont inégalées. Vous devriez pouvoir effectuer presque n’importe quelle recherche en moins de 10 ms, quel que soit le nombre d’enregistrements à rechercher, à condition que vous ayez correctement configuré votre index Lucene.
Voici le plus gros obstacle: personnellement, je pense que l’intégration de Lucene dans votre projet n’est pas facile . Bien sûr, il n’est pas trop difficile de le configurer pour que vous puissiez faire des recherches élémentaires, mais si vous voulez en tirer le maximum, avec des performances optimales, vous avez certainement besoin d’un bon livre sur Lucene.
En ce qui concerne les besoins en CPU et en RAM, effectuer une recherche dans Lucene ne fait pas trop travailler votre CPU, bien que l’indexation de vos données soit, bien que vous ne le fassiez pas trop souvent (peut-être une ou deux fois par jour). beaucoup d’obstacles.
Il ne répond pas à toutes vos questions, mais en bref, si vous avez beaucoup de données à rechercher et que vous voulez de bonnes performances, alors je pense que Lucene est définitivement la voie à suivre. Si vous ne voulez pas avoir autant de données à rechercher, vous pouvez aussi opter pour une recherche en texte intégral dans la firebase database. Configurer une recherche en texte intégral MySQL est certainement plus facile dans mon livre.
Je suis surpris qu’il n’y ait pas plus d’informations sur Solr. Solr est assez similaire à Sphinx mais a des fonctionnalités plus avancées (AFAIK car je n’ai pas utilisé Sphinx – seulement à ce sujet).
La réponse au lien ci-dessous donne quelques détails sur Sphinx, qui s’applique également à Solr. Comparaison du moteur de recherche en texte intégral – Lucene, Sphinx, Postgresql, MySQL?
Solr fournit également les fonctionnalités supplémentaires suivantes:
BTW, il y a des tonnes de fonctionnalités supplémentaires; Cependant, j’ai énuméré uniquement les fonctionnalités que j’ai réellement utilisées dans la production. BTW, out of the box, MySQL prend en charge # 1, # 3 et # 11 (limité) dans la liste ci-dessus. Pour les fonctionnalités que vous recherchez, une firebase database relationnelle ne va pas la couper. Je les éliminerais tout de suite.
Un autre avantage est que Solr (bien, Lucene en fait) est une firebase database de documents (par exemple NoSQL). En d’autres termes, vous pouvez l’utiliser pour plus que la simple recherche (c.-à-d. La performance). Faites preuve de créativité avec ça 🙂
En plus de répondre aux questions des OP, permettez-moi de vous donner quelques informations sur Apache Solr, de la simple introduction à l’installation et à la mise en œuvre détaillées .
Introduction simple
Toute personne ayant déjà expérimenté les moteurs de recherche ci-dessus ou d’autres moteurs ne figurant pas dans la liste – j’aimerais entendre vos opinions.
Solr ne devrait pas être utilisé pour résoudre des problèmes en temps réel. Pour les moteurs de recherche, Solr est quasiment un jeu et fonctionne parfaitement .
Solr fonctionne bien sur les applications web à fort trafic ( j’ai lu quelque part que cela ne convenait pas, mais je sauvegarde cette déclaration ). Il utilise la RAM, pas le CPU.
- pertinence et classement des résultats
Le coup de pouce vous aide à classer vos résultats sur le dessus. Dites, vous essayez de rechercher un nom john dans les champs prénom et nom , et vous voulez donner de la pertinence au champ prénom , puis vous devez augmenter le champ prénom comme indiqué.
http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john
Comme vous pouvez le voir, le champ firstname est renforcé avec un score de 2.
Plus sur SolrRelevancy
- vitesse de recherche et d’indexation
La vitesse est incroyablement rapide et sans compromis. La raison pour laquelle j’ai déménagé à Solr .
En ce qui concerne la vitesse d’indexation, Solr peut également gérer JOINS à partir de vos tables de firebase database. Un JOIN plus élevé et complexe affecte la vitesse d’indexation. Cependant, une énorme configuration de RAM peut facilement résoudre ce problème.
Plus la RAM est élevée, plus la vitesse d’indexation de Solr est rapide.
- facilité d’utilisation et facilité d’intégration avec Django
Je n’ai jamais essayé d’intégrer Solr et Django , mais vous pouvez le faire avec Haystack . J’ai trouvé un article intéressant sur le même sujet et voici le github pour cela.
- ressources nécessaires – le site sera hébergé sur un VPS, donc idéalement, le moteur de recherche ne nécessiterait pas beaucoup de RAM et de processeur
Solr se reproduit en RAM, donc si la RAM est élevée, vous n’avez pas à vous soucier de Solr .
L’ utilisation de la mémoire vive de Solr pousse à l’indexation complète si vous avez quelques milliards d’enregistrements, vous pourriez donc utiliser intelligemment les importations de Delta pour faire face à cette situation. Comme expliqué, Solr n’est qu’une solution en temps quasi réel .
- évolutivité
Solr est hautement évolutif. Jetez un oeil sur SolrCloud . Quelques caractéristiques clés
- des fonctionnalités supplémentaires telles que “voulez-vous dire?”, des recherches connexes, etc.
Pour le scénario ci-dessus, vous pouvez utiliser SpellCheckComponent qui est emballé avec Solr . Il existe de nombreuses autres fonctionnalités, le SnowballPorterFilterFactory permet de récupérer des enregistrements, par exemple si vous avez tapé des livres plutôt que des livres , vous obtiendrez des résultats liés au livre .
Cette réponse se concentre principalement sur Apache Solr & MySQL . Django est hors de scope.
En supposant que vous êtes sous environnement LINUX, vous pouvez poursuivre cet article. (la mienne était une version d’Ubuntu 14.04)
Installation détaillée
Téléchargez Apache Solr d’ ici . Ce serait la version 4.8.1 . Vous pouvez télécharger de nouvelles versions, j’ai trouvé cette stable.
Après avoir téléchargé l’archive, extrayez-la dans un dossier de votre choix. Dites .. Downloads
ou autre chose. Donc, cela ressemblera à Downloads/solr-4.8.1/
Sur votre invite .. Naviguer dans le répertoire
shankar@shankar-lenovo: cd Downloads/solr-4.8.1
Alors maintenant tu es ici ..
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$
Jetty est disponible dans le dossier examples du répertoire solr-4.8.1
donc à l’intérieur de ce répertoire et démarrez le serveur d’applications Jetty.
shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar
Maintenant, ne fermez pas le terminal, ne le réduisez pas et laissez-le de côté.
(ASTUCE: Utilisez & after start.jar pour faire fonctionner le serveur Jetty en arrière-plan)
Pour vérifier si Apache Solr fonctionne correctement, visitez cette URL sur le navigateur. http: // localhost: 8983 / solr
Il fonctionne sur le port 8983 par défaut. Vous pouvez modifier le port ici ou directement dans le fichier jetty.xml
.
java -Djetty.port=9091 -jar start.jar
Ce fichier JAR sert de pont entre MySQL et JDBC. Téléchargez la version indépendante de la plate-forme ici
Après l’avoir téléchargé, extrayez le dossier et copiez le mysql-connector-java-5.1.31-bin.jar
et collez-le dans le répertoire lib .
shankar@shankar-lenovo:~/Downloads/solr-4.8.1/consortingb/dataimporthandler/lib
Pour utiliser Solr , vous devez rechercher des tables et des données. Pour cela, nous allons utiliser MySQL pour créer une table et pousser des noms aléatoires, puis utiliser Solr pour nous connecter à MySQL et indexer cette table et ses entrées.
CREATE TABLE test_solr_mysql ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45) NULL, created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) );
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca'); INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf
Ajoutez ces deux directives à ce fichier.
Maintenant, ajoutez le DIH (Data Import Handler)
db-data-config.xml
Si le fichier existe alors ignorez, ajoutez ces lignes à ce fichier. Comme vous pouvez voir la première ligne, vous devez fournir les informations d’identification de votre base de données MySQL . Le nom de la firebase database, le nom d’utilisateur et le mot de passe.
(ASTUCE: vous pouvez avoir n’importe quel nombre d’entités, mais faites attention au champ id, si elles sont identiques, puis l’indexation sera ignorée.)
Ajoutez ceci à votre schéma.xml comme indiqué.
id
la mise en oeuvre
C’est là que se trouve la vraie affaire. Vous devez effectuer l’indexation des données de MySQL vers Solr pour pouvoir utiliser les requêtes Solr.
Cliquez sur l’URL http: // localhost: 8983 / solr sur votre navigateur. L’écran s’ouvre comme ceci.
Comme l’indique le marqueur, accédez à Enregistrement pour vérifier si l’une des configurations ci-dessus a entraîné des erreurs.
Ok, maintenant vous êtes ici. Comme vous pouvez le faire, il y a beaucoup de messages jaunes (AVERTISSEMENTS). Assurez-vous de ne pas avoir de message d’erreur marqué en rouge. Auparavant, sur notre configuration, nous avions ajouté une requête select sur notre fichier db-data-config.xml . Dites s’il y avait des erreurs sur cette requête, elle serait apparue ici.
Bien, pas d’erreurs. Nous sums prêts à partir. Choisissons collection1 dans la liste comme indiqué et sélectionnez Dataimport
En utilisant le DIH, vous vous connecterez à MySQL depuis Solr via le fichier de configuration db-data-config.xml depuis l’interface Solr et récupérerez les 10 enregistrements de la firebase database qui seront indexés sur Solr .
Pour ce faire, choisissez l’ importation complète et cochez les options Nettoyer et Valider . Cliquez maintenant sur Execute comme indiqué.
Vous pouvez également utiliser une requête directe d’ importation complète comme celle-ci.
http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true
Après avoir cliqué sur Exécuter , Solr commence à indexer les enregistrements. S’il y a des erreurs, cela signifie que l’ indexation a échoué et que vous devez revenir à la section Journalisation pour voir ce qui ne va pas.
En supposant qu’il n’y ait pas d’erreurs avec cette configuration et si l’indexation est terminée avec succès, vous obtiendrez cette notification.
Il semble que tout se soit bien passé, vous pouvez maintenant utiliser Solr Queries pour interroger les données indexées. Cliquez sur la requête à gauche, puis appuyez sur le bouton Exécuter en bas.
Vous verrez les enregistrements indexés comme indiqué.
La requête Solr correspondante pour répertorier tous les enregistrements est
http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true
Eh bien, il y a tous les 10 enregistrements indexés. Disons que nous n’avons besoin que de noms commençant par Ja , dans ce cas, vous devez cibler le nom de colonne solr_name
, votre requête va donc comme ceci.
http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true
C’est comme ça que vous écrivez des requêtes Solr . Pour en savoir plus à ce sujet, consultez ce bel article .
Je regarde la recherche de texte intégral PostgreSQL en ce moment, et elle offre toutes les fonctionnalités d’un moteur de recherche moderne, un très bon caractère étendu et une prise en charge multilingue, une intégration étroite avec les champs de texte de la firebase database.
Mais il n’a pas d’opérateurs de recherche conviviaux comme + ou AND (utilise & |!) Et je ne suis pas enchanté de la façon dont cela fonctionne sur leur site de documentation. Bien qu’il y ait en gras des termes de correspondance dans les extraits de résultats, l’algorithme par défaut pour lequel les termes de correspondance ne sont pas bons. De plus, si vous souhaitez indexer rtf, PDF, MS Office, vous devez rechercher et intégrer un convertisseur de format de fichier.
OTOH, c’est bien mieux que la recherche de texte MySQL, qui n’indexe même pas les mots de trois lettres ou moins. C’est la valeur par défaut pour la recherche MediaWiki, et je pense vraiment que ce n’est pas bon pour les utilisateurs finaux: http://www.searchtools.com/analysis/mediawiki-search/
Dans tous les cas j’ai vu, Lucene / Solr et Sphinx sont vraiment géniaux . Ils sont un code solide et ont évolué avec des améliorations significatives en termes de convivialité, de sorte que les outils sont tous là pour rendre la recherche satisfaisante pour presque tout le monde.
pour SHAILI – SOLR inclut la bibliothèque de codes de recherche Lucene et les composants constituent un moteur de recherche autonome.
Juste mes deux cents à cette très vieille question. Je recommande fortement de jeter un oeil à ElasticSearch .
Elasticsearch est un serveur de recherche basé sur Lucene. Il fournit un moteur de recherche en texte intégral dissortingbué et compatible avec plusieurs utilisateurs avec une interface Web RESTful et des documents JSON sans schéma. Elasticsearch est développé en Java et est publié en open source selon les termes de la licence Apache.
Les avantages par rapport aux autres moteurs FTS (recherche en texte intégral) sont les suivants:
Nous utilisons ce moteur de recherche dans notre projet et nous en sums très heureux.
SearchTools-Avi a déclaré “Recherche de texte MySQL, qui n’indexe même pas les mots de trois lettres ou moins.”
FYIs, La longueur minimale du mot MySQL fulltext est réglable depuis au moins MySQL 5.0. Google ‘mysql fulltext min length’ pour des instructions simples.
Cela dit, MySQL fulltext a ses limites: pour un, il est lent à se mettre à jour lorsque vous atteignez un million d’enregistrements environ, …
J’appendais mnoGoSearch à la liste. Solution extrêmement performante et flexible, qui fonctionne comme Google: l’indexeur récupère les données de plusieurs sites, vous pouvez utiliser des critères de base, ou inventer vos propres points d’ancrage pour obtenir une qualité de recherche maximale. En outre, il pourrait extraire les données directement de la firebase database.
La solution n’est pas si connue aujourd’hui, mais elle ne nécessite que des besoins maximum. Vous pouvez le comstackr et l’installer ou sur un serveur autonome, ou même sur votre serveur principal, il n’a pas besoin de tant de ressources que Solr, car il est écrit en C et fonctionne parfaitement même sur de petits serveurs.
Au début, vous devez le comstackr vous-même, cela nécessite donc des connaissances. J’ai fait un petit script pour Debian, ce qui pourrait aider. Tous les ajustements sont les bienvenus.
Comme vous utilisez le framework Django, vous pourriez utiliser ou un client PHP au milieu, ou trouver une solution en Python, j’ai vu des articles .
Et bien sûr, mnoGoSearch est open source, GNU GPL.