web-dev-qa-db-fra.com

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:

  • Lucene/Lucene avec Compass/Solr

  • Sphinx

  • Postgresql intégré dans la recherche en texte intégral

  • MySQl intégré à la recherche en texte intégral

Les critères de sélection:

  • résultat pertinence et classement
  • vitesse de recherche et d'indexation
  • facilité d'utilisation et facilité d'intégration avec Django
  • besoins en ressources - le site sera hébergé sur un VPS , de sorte que le moteur de recherche ne nécessite idéalement pas beaucoup de RAM et de CPU.
  • évolutivité
  • des fonctionnalités supplémentaires telles que "Voulez-vous dire?", des recherches connexes, etc.

Toute personne ayant déjà utilisé les moteurs de recherche ci-dessus ou d’autres moteurs ne figurant pas dans la liste - j'aimerais connaître votre opinion.

ÉDITER: en ce qui concerne les besoins d’indexation, étant donné que les utilisateurs entrent continuellement dans le site, les données doivent être indexées en permanence. Il n'est pas nécessaire que ce soit en temps réel, mais idéalement, les nouvelles données figureraient dans l'index avec un délai ne dépassant pas 15 à 30 minutes.

304
Continuation

C'est bien de voir quelqu'un se mêler de Lucene - parce que je n'en ai aucune idée.

Sphinx, en revanche, je le sais très bien, voyons si je peux vous aider.

  • Le classement de pertinence des résultats est la valeur par défaut. Si vous le souhaitez, vous pouvez définir votre propre tri et attribuer des pondérations plus élevées à certains champs.
  • La vitesse d'indexation est très rapide, car elle communique directement avec la base de données. Toute lenteur viendra de requêtes SQL complexes et de clés étrangères non indexées, entre autres problèmes similaires. Je n'ai jamais remarqué de lenteur dans la recherche non plus.
  • Je suis un Rails gars, je n'ai donc aucune idée de la facilité de mise en œuvre avec Django. Cependant, une API Python est fournie avec la source Sphinx.
  • Le démon du service de recherche (searchd) utilise assez peu de mémoire - et vous pouvez définir des limites pour combien de mémoire utilisée par le processus d'indexation.
  • Mes connaissances sont plus évolutives en matière d’évolutivité - mais il est assez facile de copier des fichiers d’index sur plusieurs machines et d’exécuter plusieurs démons searchd. L’impression générale que j’entends des autres cependant, c’est que c’est très bien sous une charge élevée, alors il n’est pas nécessaire de s’adapter à son déploiement sur plusieurs machines.
  • Il n'y a pas de prise en charge de "did-you-mean", etc. - bien que cela puisse être fait avec d'autres outils assez facilement. Sphinx contient des mots bien que l'utilisation de dictionnaires, de sorte que "conduire" et "conduire" (par exemple) serait considéré comme identique dans les recherches.
  • Sphinx n'autorise cependant pas les mises à jour d'index partielles pour les données de champ. L'approche courante consiste à conserver un index delta avec toutes les modifications récentes et à le réindexer après chaque modification (et ces nouveaux résultats apparaissent en une ou deux secondes). 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 sa fréquence dépende de la volatilité de vos données - chaque jour? Toutes les heures?). Les vitesses d’indexation rapides empêchent cependant tout cela.

Je ne sais pas du tout à quel point cela s'applique à votre situation, mais Evan Weaver a comparé quelques-unes des options de recherche courantes Rails (Sphinx, Ferret (un port de Lucene pour Ruby) et Solr), en exécutant quelques points de repère. Pourrait être utile, je suppose.

Je n'ai pas approfondi la recherche en texte intégral de MySQL, mais je sais que Sphinx, Lucene ou Solr ne rivalisent ni en termes de vitesse ni de fonctionnalités.

164
pat

Je ne connais pas Sphinx, mais pour ce qui est de Lucene par rapport à une recherche en texte intégral dans la base de données, je pense que les performances de Lucene sont incomparables. Vous devriez être capable de faire presque n'importe lequel en moins de 10 ms, quel que soit le nombre d'enregistrements à rechercher, à condition que vous ayez correctement configuré votre index Lucene.

Cependant, 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 pouvoir effectuer des recherches de base, mais si vous souhaitez en tirer le meilleur parti, avec des performances optimales, vous avez absolument besoin d’un bon livre sur Lucene.

Pour ce qui est de la configuration requise pour le CPU & RAM, effectuer une recherche dans Lucene n’affectera pas trop votre CPU, bien que l’indexation de vos données le soit, bien que vous ne le fassiez pas trop souvent (peut-être une ou deux fois par jour). , donc ce n’est pas vraiment un obstacle.

Cela ne répond pas à toutes vos questions, mais en bref, si vous avez beaucoup de données à rechercher et que vous voulez des performances exceptionnelles, alors je pense que Lucene est définitivement la voie à suivre. Si vous n'allez pas avoir autant de données à rechercher, vous pouvez également opter pour une recherche en texte intégral dans la base de données. Configurer une recherche en texte intégral MySQL est certainement plus facile dans mon livre.

82
Razzie

Je suis surpris qu'il n'y ait pas plus d'informations postées à propos de Solr. Solr est assez similaire au Sphinx mais a des fonctionnalités plus avancées (autant que je sache, je n’ai pas utilisé Sphinx - je n’ai lu qu’à ce sujet).

La réponse au lien ci-dessous détaille quelques éléments de Sphinx qui s'appliquent é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. Cœurs multiples (considérez-les comme des bases de données séparées 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 d'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. Communiquez avec le serveur de recherche via HTTP (il peut même renvoyer Json, PHP natif/Ruby/Python)
  7. PDF, indexation de documents Word
  8. Champs dynamiques
  9. Facettes
  10. Champs agrégés
  11. Mots vides, synonymes, etc.
  12. Plus comme ça ...
  13. Indexer directement à partir de la base de données avec des requêtes personnalisées
  14. Suggestion automatique
  15. Cache automatique
  16. Indexation rapide (comparée aux temps d'indexation de la recherche de texte intégral MySQL) - Lucene utilise un format d'index inversé binaire.
  17. Boosting (règles personnalisées pour accroître la pertinence d'un mot clé ou d'une phrase en particulier, etc.)
  18. Recherches sur le terrain (si un utilisateur de recherche connaît le champ qu'il/elle souhaite rechercher, il restreint sa recherche en tapant 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 plus de fonctionnalités; Cependant, je n'ai répertorié que les fonctionnalités que j'ai réellement utilisées en production. Par ailleurs, MySQL prend immédiatement en charge les positions n ° 1, n ° 3 et n ° 11 (limitées) de la liste ci-dessus. Pour les fonctionnalités que vous recherchez, une base de données relationnelle ne va pas la couper. Je les éliminerais tout de suite.

De plus, un autre avantage est que Solr (enfin, Lucene) est une base de données de documents (NoSQL, par exemple), de sorte que de nombreux avantages de toute autre base de données de documents peuvent être obtenus avec Solr. En d’autres termes, vous pouvez l’utiliser plus que pour la recherche (c’est-à-dire les performances). Soyez créatif avec ça :)

60
Wil Moore III

Apache Solr


En plus de répondre aux questions de OP, permettez-moi de vous éclairer sur Apache Solr de simple introduction à installation détaillée et à mise en oeuvre .

Introduction simple


Tous ceux qui ont déjà utilisé les moteurs de recherche ci-dessus ou d’autres moteurs ne figurant pas dans la liste - j'aimerais connaître votre opinion.

Solr ne devrait pas être utilisé pour résoudre des problèmes en temps réel. Pour les moteurs de recherche, Solr est à peu près un jeu et fonctionne parfaitement .

Solr fonctionne correctement avec les applications Web à trafic élevé (. J'ai lu quelque part que cela ne convenait pas, mais je suis d'accord cette déclaration ). Il utilise la RAM, pas le processeur.

  • résultat pertinence et classement

Le boost vous aide à classer vos résultats en premier. Disons que vous essayez de rechercher un nom john dans les champs prénom et nom , et vous voulez donner de la pertinence au champ prenom , alors vous devez augmenter dans le champ prenom comme indiqué.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Comme vous pouvez le constater, le champ du prénom est renforcé avec un score de 2.

Plus sur SolrRelevancy

  • vitesse de recherche et d'indexation

La vitesse est incroyablement rapide et aucun compromis sur cela. La raison pour laquelle j'ai déménagé à Solr .

En ce qui concerne la vitesse d'indexation, , Solr peut également gérer REJOINT à partir de votre tables de base de données. Une jointure supérieure et complexe JOIN affecte la vitesse d'indexation. Cependant, une énorme RAM peut facilement résoudre cette situation.

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

Jamais tenté d'intégrer Solr et Django , peu importe la façon dont vous pouvez le faire cela avec Haystack . J'ai trouvé des informations intéressantes article sur la même chose et voici le github pour cela.

  • besoins en ressources - le site sera hébergé sur un serveur VPS. L'idéal serait donc que le moteur de recherche n'exige pas beaucoup de RAM et de la CPU.

Solr se reproduit sur la RAM, donc si le RAM est élevé, vous n'avez pas à vous soucier de Solr .

L'usage de RAM de Solr monte à l'indexation complète si vous avez quelques milliards d'enregistrements, vous pouvez utiliser intelligemment les importations Delta pour vous attaquer cette situation. Comme expliqué, Solr n’est qu’une solution quasi-temps réel .

  • évolutivité

Solr est hautement évolutif. Jetez un coup d'œil sur SolrCloud . Quelques caractéristiques clés de celui-ci.

  • Shards (ou sharding est le concept de répartition de l'index entre plusieurs machines, par exemple si votre index est devenu trop gros)
  • Équilibrage de la charge (si Solrj est utilisé avec Solr cloud, il se charge automatiquement de l'équilibrage de la charge à l'aide de son mécanisme Round-Robin)
  • recherche distribué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 le SpellCheckComponent qui est emballé avec Solr . Il y a beaucoup d'autres fonctionnalités, Le SnowballPorterFilterFactory permet de récupérer des enregistrements, par exemple si vous avez tapé, books au lieu de book , vous obtiendrez des résultats liés à book .


Cette réponse se concentre largement sur Apache Solr & MySQL . Django est hors de portée.

En supposant que vous êtes sous l'environnement LINUX, vous pouvez continuer à lire cet article. (la mienne était une version Ubuntu 14.04)

Installation détaillée

Commencer

Télécharger Apache Solr à partir de ici . Ce serait la version est 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 .. Cela ressemblera donc à Downloads/solr-4.8.1/

Sur votre invite .. Naviguez dans le répertoire

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Alors maintenant vous êtes ici ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Démarrer le serveur d'applications Jetty

Jetty est disponible dans le dossier des exemples du répertoire solr-4.8.1. Par conséquent, naviguez à l'intérieur de celui-ci 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, minimisez-le et laissez-le de côté.

(CONSEIL: Utilisez & after start.jar pour que le serveur Jetty s'exécute en arrière-plan)

Pour vérifier si Apache Solr fonctionne correctement, visitez cette URL sur le navigateur. http: // localhost: 8983/solr

Lancer la jetée sur un port personnalisé

Il fonctionne sur le port 8983 par défaut. Vous pouvez changer 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, copiez themysql-connector-Java-5.1.31-bin.jar et collez-le dans le répertoire lib .

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Création de la table MySQL pour être liée à Apache Solr

Pour mettre Solr à utiliser, vous devez disposer de quelques tables et données à rechercher. Pour cela, nous allons utiliser MySQL pour créer une table et pousser des noms aléatoires, puis nous pourrions utiliser Solr pour vous connecter à MySQL et indexer cette table et ses entrées.

1. Structure de la 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. Remplissez 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 noyau et ajouter les directives lib

1. Naviguez vers

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

2.Modification du fichier solrconfig.xml

Ajoutez ces deux directives à ce fichier.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Maintenant, ajoutez le DIH (gestionnaire d'importation de données)

<requestHandler name="/dataimport" 
  class="org.Apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Créez le fichier db-data-config.xml

Si le fichier existe alors ignorez, ajoutez ces lignes à ce fichier. Comme vous pouvez le voir sur la première ligne, vous devez fournir les informations d'identification de votre base de données MySQL . Le nom de la base de données, nom d'utilisateur et mot de passe.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(CONSEIL: vous pouvez avoir un nombre quelconque d’entités, mais méfiez-vous du champ id. Si elles sont identiques, l’indexation est ignorée.)

4.Modifiez le fichier schema.xml

Ajoutez ceci à votre schema.xml comme indiqué.

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

La mise en oeuvre

Indexage

C'est là que réside la vraie affaire. Vous devez faire l'indexation des données de MySQL à Solr afin de utiliser les requêtes Solr.

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

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

This is the main Apache Solr Administration Panel

Comme le marqueur l'indique, accédez à Logging afin de 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, il y a beaucoup de messages jaunes (AVERTISSEMENTS). Assurez-vous que les messages d'erreur ne sont pas marqués en rouge. Plus tôt, dans notre configuration, nous avions ajouté une requête de sélection sur notre db-data-config.xml , par exemple, s'il y avait des erreurs dans cette requête, aurait montré ici.

This is the logging section of your Apache Solr engine

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

Étape 3: DIH (Data Import Handler)

En utilisant le DIH, vous vous connecterez à MySQL depuis Solr via le fichier de configuration db-data-config.xml à partir de l'interface Solr et récupérer les 10 enregistrements de la base de données indexée sur Solr .

Pour ce faire, choisissez importation complète , puis cochez les options Nettoyer et Commit . Maintenant, cliquez sur Execute comme indiqué.

Vous pouvez également utiliser une requête directe d'importation complète comme celle-ci aussi.

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

The Data Import Handler

Après avoir cliqué sur , exécutez , Solr commence à indexer les enregistrements, le cas échéant. S'il y avait des erreurs, cela signifierait l'indexation a échoué et vous devez revenir à la journalisation section pour voir ce qui a mal tourné.

En supposant qu'il n'y ait pas d'erreur avec cette configuration et si l'indexation est terminée avec succès, vous obtiendrez cette notification.

Indexing Success

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

On dirait que tout s'est bien passé, vous pouvez maintenant utiliser Solr des requêtes 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 correspondante Solr pour répertorier tous les enregistrements est

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

The indexed data

Eh bien, voici les 10 enregistrements indexés. Disons que nous n’avons besoin que des noms commençant par Ja , dans ce cas, vous devez cibler le nom de la colonne solr_name. Par conséquent, votre requête est la suivante: cette.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

The JSON data starting with Ja*

C'est comme ça que vous écrivez Solr Requêtes. Pour en savoir plus, consultez cette belle article .

57
Shankar Damodaran

Je recherche actuellement la recherche en texte intégral PostgreSQL, qui offre toutes les fonctionnalités d'un moteur de recherche moderne, de très bons caractères étendus et une prise en charge multilingue, une intégration étroite avec les champs de texte de la base de données.

Mais il n'a pas d'opérateurs de recherche conviviaux comme + ou AND (utilise & |!) Et je ne suis pas ravi de la façon dont cela fonctionne sur leur site de documentation. Bien qu'il y ait des termes de correspondance en gras dans les extraits de résultats, l'algorithme par défaut pour lequel les termes de correspondance n'est pas génial. En outre, 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 dans MediaWiki, et je pense vraiment que cela ne va pas pour les utilisateurs finaux: http://www.searchtools.com/analysis/mediawiki-search/

Dans tous les cas que j'ai vus, Lucene/Solr et Sphinx sont vraiment géniaux . C’est un code solide qui a évolué avec d’importantes améliorations en termes de convivialité. Les outils sont donc tous là pour faire des recherches qui satisfont presque tout le monde.

pour SHAILI - SOLR inclut la bibliothèque de codes de recherche Lucene et comporte les composants nécessaires pour constituer un moteur de recherche autonome Nice.

28
SearchTools-Avi

Juste mes deux cents à cette très vieille question. Je recommanderais fortement de jeter un oeil à ElasticSearch .

Elasticsearch est un serveur de recherche basé sur Lucene. Il fournit un moteur de recherche de texte intégral distribué compatible multitenant 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 de Lucene
  • Documentation exhaustive
  • Il y en a beaucoup bibliothèques open source disponibles (y compris Django)

Nous utilisons ce moteur de recherche dans notre projet et nous en sommes très heureux.

22
vooD

SearchTools-Avi a déclaré: "Recherche de texte MySQL, qui n'indexe même pas les mots de trois lettres ou moins."

Pour votre information, la longueur de mot minimum pour le texte intégral MySQL est réglable depuis au moins MySQL 5.0. Google 'mysql fulltext min length' pour des instructions simples.

Cela dit, le texte intégral de MySQL a des limites: il est lent à mettre à jour une fois que vous avez atteint un million d'enregistrements, ...

10
BJ.

J'ajouterais mnoGoSearch à la liste. Solution extrêmement performante et flexible, fonctionnant comme Google: indexeur récupère les données de plusieurs sites, vous pouvez utiliser des critères de base ou inventer vos propres crochets pour obtenir une qualité de recherche maximale. En outre, il pourrait récupérer les données directement à partir de la base de données.

La solution n’est pas aussi connue aujourd’hui, mais elle répond à des besoins maximaux. Vous pouvez le compiler et l'installer sur un serveur autonome ou même sur votre serveur principal. Il ne nécessite pas autant 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 compiler vous-même, il nécessite donc quelques connaissances. J'ai fait un petit script pour Debian, ce qui pourrait aider. Tous les ajustements sont les bienvenus.

Comme vous utilisez Django framework, vous pouvez utiliser ou PHP client au milieu, ou trouver une solution en Python, j'ai vu n pearticles .

Et bien sûr, mnoGoSearch est open source, GNU GPL.

2
Fedir RYKHTIK