Comparaison du moteur de recherche en texte intégral – Lucene, Sphinx, Postgresql, MySQL?

Je construis un site Django et je recherche un moteur de recherche.

Quelques candidats:

Les critères de sélection:

  • pertinence et classement des résultats
  • vitesse de recherche et d’indexation
  • facilité d’utilisation et facilité d’intégration avec Django
  • 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
  • évolutivité
  • des fonctionnalités supplémentaires telles que “voulez-vous dire?”, des recherches connexes, etc.

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.

    • Le classement de pertinence des résultats est la valeur par défaut. Vous pouvez configurer votre propre sorting si vous le souhaitez et donner aux domaines spécifiques des pondérations plus élevées.
    • La vitesse d’indexation est extrêmement rapide, car elle communique directement avec la firebase database. Toute lenteur proviendra de requêtes SQL complexes, de clés étrangères non indexées et d’autres problèmes de ce type. Je n’ai jamais remarqué de lenteur dans la recherche non plus.
    • Je suis un gars de Rails, donc je n’ai aucune idée de la facilité d’implémentation avec Django. Il existe cependant une API Python fournie avec la source Sphinx.
    • Le démon du service de recherche (searchd) est relativement peu utilisé en mémoire – et vous pouvez définir des limites sur la quantité de mémoire utilisée par le processus de l’indexeur.
    • L’évolutivité est l’endroit où mes connaissances sont plus sommaires – mais il est assez facile de copier des fichiers d’index sur plusieurs machines et d’exécuter plusieurs démons de recherche. L’impression générale que j’obtiens chez les autres, c’est que c’est très bien sous une charge élevée, donc il n’est pas nécessaire de gérer le redimensionnement sur plusieurs machines.
    • Il n’y a pas de support pour “did-you-mean”, etc. – bien que cela puisse être fait avec d’autres outils assez facilement. Si Sphinx utilise des dictionnaires, les mots sont stoppés, de sorte que «conduire» et «conduire» (par exemple) seraient considérés comme identiques dans les recherches.
    • Sphinx n’autorise cependant pas les mises à jour partielles des index pour les données de champs. L’approche courante consiste à maintenir un index delta avec tous les changements récents et à le réindexer après chaque modification (et ces nouveaux résultats apparaissent dans un délai d’une seconde ou deux). En raison de la faible quantité de données, cela peut prendre quelques secondes. Vous devrez néanmoins réindexer régulièrement le jeu de données principal (bien que la fréquence dépend de la volatilité de vos données – chaque jour? Chaque heure?). Les vitesses d’indexation rapides gardent tout cela très indolore.

    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:

    1. Prend en charge la réplication
    2. Plusieurs cœurs (considérez-les comme des bases de données distinctes avec leur propre configuration et leurs propres index)
    3. Recherches booléennes
    4. Mise en évidence des mots-clés (assez facile à faire dans le code de l’application si vous avez regex-fu; cependant, pourquoi ne pas laisser un outil spécialisé faire un meilleur travail pour vous)
    5. Mettre à jour l’index via XML ou un fichier délimité
    6. Communiquer avec le serveur de recherche via HTTP (il peut même renvoyer Json, PHP / Ruby / Python natif)
    7. PDF, indexation de documents Word
    8. Champs dynamics
    9. Facettes
    10. Champs agrégés
    11. Stop mots, synonymes, etc.
    12. Plus comme ça …
    13. Index directement à partir de la firebase database avec des requêtes personnalisées
    14. Suggérer automatiquement
    15. Mise en cache automatique
    16. Indexation rapide (comparez aux temps d’indexation de la recherche en texte intégral MySQL) – Lucene utilise un format d’index inversé binary.
    17. Boosting (règles personnalisées pour augmenter la pertinence d’un mot clé ou d’une phrase, etc.)
    18. Recherches par champs (si un utilisateur de recherche connaît le champ dans lequel il souhaite effectuer une recherche, il affine sa recherche en saisissant le champ, puis la valeur et UNIQUEMENT ce champ est recherché plutôt que tout – une expérience utilisateur bien meilleure)

    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 🙂

    Apache Solr


    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

    • Shards (ou sharding est le concept de dissortingbution de l’index entre plusieurs machines, par exemple si votre index est devenu trop grand)
    • Équilibrage de charge (si Solrj est utilisé avec Solr Cloud, il prend automatiquement en charge l’équilibrage de charge à l’aide de son mécanisme Round-Robin)
    • Recherche dissortingbuée
    • La haute disponibilité
    • 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

    Commencer

    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$

    Démarrer le serveur d’applications Jetty

    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

    Running Jetty sur un port personnalisé

    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

    Télécharger le JConnector

    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

    Créer la table MySQL à associer à Apache Solr

    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.

    Structure 1.Table

     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) ); 

    2.Populer le tableau ci-dessus

     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'); 

    Entrer dans le kernel et append les directives lib

    1.Naviguer à

     shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf 

    2.Modifier le fichier solrconfig.xml

    Ajoutez ces deux directives à ce fichier.

        

    Maintenant, ajoutez le DIH (Data Import Handler)

       db-data-config.xml   

    3.Créez le fichier 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.)

    4. Modifiez le fichier schema.xml

    Ajoutez ceci à votre schéma.xml comme indiqué.

     id  

    la mise en oeuvre

    Indexage

    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.

    Étape 1: Accédez au panneau d’administration Solr

    Cliquez sur l’URL http: // localhost: 8983 / solr sur votre navigateur. L’écran s’ouvre comme ceci.

    Ceci est le panneau d'administration principal d'Apache Solr

    Comme l’indique le marqueur, accédez à Enregistrement pour vérifier si l’une des configurations ci-dessus a entraîné des erreurs.

    Étape 2: Vérifiez vos journaux

    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.

    Ceci est la section de journalisation de votre moteur Apache Solr

    Bien, pas d’erreurs. Nous sums prêts à partir. Choisissons collection1 dans la liste comme indiqué et sélectionnez Dataimport

    Étape 3: DIH (gestionnaire d’importation de données)

    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 

    Le gestionnaire d'importation de données

    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.

    Succès d'indexation

    Étape 4: Exécution de requêtes Solr

    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 

    Les données indexées

    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 

    Les données JSON commençant par Ja *

    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:

    • Interface RESTful
    • Meilleure évolutivité
    • Grande communauté
    • Construit par les développeurs Lucene
    • Documentation complète
    • Il existe de nombreuses bibliothèques open source disponibles (y compris Django)

    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.