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:
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.
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.
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.
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.
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:
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 :)
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.
- 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
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$
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
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
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
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.
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.
<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>
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.)
Ajoutez ceci à votre schema.xml comme indiqué.
<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />
La mise en oeuvre
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.
Appuyez sur l'URL http: // localhost: 8983/solr sur votre navigateur. L'écran s'ouvre comme ceci.
Comme le marqueur l'indique, accédez à Logging afin de vérifier si l'une des configurations ci-dessus a entraîné des erreurs.
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.
Bien, pas d'erreurs. Nous sommes 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 à 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
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.
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
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
C'est comme ça que vous écrivez Solr Requêtes. Pour en savoir plus, consultez cette belle article .
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.
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:
Nous utilisons ce moteur de recherche dans notre projet et nous en sommes 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."
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, ...
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.