Je construis un site Django et je recherche un moteur de recherche.
Quelques candidats:
Lucene / Lucene avec boussole / Solr
Sphinx
Recherche de texte intégral intégrée à PostgreSQL
Recherche de texte intégral intégrée à MySQl
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 requises - le site sera hébergé sur un VPS , donc idéalement le moteur de recherche ne nécessiterait pas beaucoup de RAM et de CPU
- évolutivité
- fonctionnalités supplémentaires telles que "vouliez-vous dire?", recherches associées, etc.
Quiconque a déjà eu de l'expérience avec les moteurs de recherche ci-dessus, ou d'autres moteurs ne figurant pas dans la liste - j'aimerais entendre vos opinions.
EDIT: Quant aux besoins d'indexation, comme les utilisateurs continuent à saisir des données sur le site, ces données devraient être indexées en continu. Il n'est pas nécessaire que ce soit en temps réel, mais dans l'idéal, les nouvelles données devraient apparaître dans l'index sans plus de 15 à 30 minutes de retard
mysql
postgresql
full-text-search
lucene
sphinx
Continuation
la source
la source
Tsearch
ne prend pas en charge la recherche de phrases. Cependant, il figure sur la liste TODO sai.msu.su/~megera/wiki/FTS_Todo .Réponses:
C'est bon de voir quelqu'un parler de Lucene - parce que je n'en ai aucune idée.
Sphinx, d'un autre côté, je le sais très bien, alors voyons si je peux vous aider.
Je ne sais pas à quel point cela 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), en exécutant quelques références. Cela pourrait être utile, je suppose.
Je n'ai pas sondé les profondeurs de la recherche en texte intégral de MySQL, mais je sais qu'il ne rivalise pas en termes de vitesse ni de fonctionnalités avec Sphinx, Lucene ou Solr.
la source
Je ne connais pas Sphinx, mais comme pour Lucene vs une recherche de texte intégral dans une base de données, je pense que les performances de Lucene sont inégalées. Vous devriez pouvoir effectuer presque toutes les recherches en moins de 10 ms, quel que soit le nombre d'enregistrements à rechercher, à condition d'avoir 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 afin que vous puissiez faire une recherche de base, mais si vous voulez en tirer le meilleur parti, avec des performances optimales, alors vous avez certainement besoin d'un bon livre sur Lucene.
En ce qui concerne les exigences de CPU et de RAM, effectuer une recherche dans Lucene ne charge 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 beaucoup d'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 de grandes performances, je pense que Lucene est définitivement la voie à suivre. Si vous n'allez pas avoir autant de données à rechercher, alors vous pourriez aussi bien opter pour une recherche de texte intégral dans la base de données. Configurer une recherche de texte intégral MySQL est certainement plus facile dans mon livre.
la source
Je suis surpris qu'il n'y ait pas plus d'informations publiées sur Solr. Solr est assez similaire à Sphinx mais a des fonctionnalités plus avancées (AFAIK car je n'ai pas utilisé Sphinx - lisez seulement à ce sujet).
La réponse sur le lien ci-dessous détaille certaines choses sur Sphinx qui s'appliquent également à Solr. Comparaison des moteurs de recherche plein texte - Lucene, Sphinx, Postgresql, MySQL?
Solr propose également les fonctionnalités supplémentaires suivantes:
BTW, il y a des tonnes de fonctionnalités supplémentaires; cependant, je n'ai énuméré que les fonctionnalités que j'ai réellement utilisées en production. BTW, prêt à l'emploi, MySQL prend en charge # 1, # 3 et # 11 (limité) dans la liste ci-dessus. Pour les fonctionnalités que vous recherchez, une base de données relationnelle ne suffira pas. Je les éliminerais tout de suite.
En outre, un autre avantage est que Solr (enfin, Lucene en fait) est une base de données de documents (par exemple NoSQL), de sorte que de nombreux avantages de toute autre base de données de documents peuvent être réalisés avec Solr. En d'autres termes, vous pouvez l'utiliser pour plus qu'une simple recherche (c'est-à-dire des performances). Soyez créatif avec ça :)
la source
Apache Solr
En plus de répondre aux requêtes d'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 .
Solr ne doit 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 très bien sur les applications Web à haut trafic ( j'ai lu quelque part que cela ne convient pas à cela, mais je sauvegarde cette déclaration ). Il utilise la RAM, pas le CPU.
Le boost vous aide à classer vos résultats en tête de liste. Dites, vous essayez de rechercher un nom john dans les champs prénom et nom , et vous voulez donner de la pertinence à la champ prénom , vous devez ensuite augmenter le champ prénom comme indiqué.
Comme vous pouvez le voir, le champ du prénom est boosté avec un score de 2.
Plus sur SolrRelevancy
La vitesse est incroyablement rapide et aucun compromis à ce sujet. La raison pour laquelle j'ai déménagé chez Solr .
Concernant la vitesse d'indexation, Solr peut également gérer les JOINS à partir de vos tables de base de données. 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.
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 et voici le github pour cela.
Solr se reproduit sur la RAM, donc si la RAM est élevée, vous n'avez pas à vous soucier de Solr .
L' utilisation de la RAM de Solr grimpe sur l'indexation complète si vous avez quelques milliards d'enregistrements, vous pouvez utiliser intelligemment les importations Delta pour faire face à cette situation. Comme expliqué, Solr n'est qu'une solution en temps quasi réel .
Solr est hautement évolutif. Jetez un oeil sur SolrCloud . Quelques caractéristiques clés de celui-ci.
Pour le scénario ci-dessus, vous pouvez utiliser le SpellCheckComponent fourni 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 au lieu du livre , les résultats liés au livre vous seront présentés .
Cette réponse se concentre largement sur Apache Solr et MySQL . Django est hors de portée.
En supposant que vous êtes sous environnement LINUX, vous pouvez continuer cet article. (le mien était une version Ubuntu 14.04)
Commencer
Téléchargez Apache Solr à partir d' ici . Ce serait la version 4.8.1 . Vous pouvez télécharger de nouvelles versions, j'ai trouvé cette écurie.
Après avoir téléchargé l'archive, extrayez-la dans un dossier de votre choix. Dites ..
Downloads
ou quoi que ce soit .. Donc ça ressembleraDownloads/solr-4.8.1/
À 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émarrez Jetty Application Server
Jetty est disponible dans le dossier d'exemples du
solr-4.8.1
répertoire, alors parcourez-le et démarrez Jetty Application Server.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é.
Pour vérifier si Apache Solr fonctionne correctement, visitez cette URL sur le navigateur.http: // localhost: 8983 / solr
Exécution de Jetty sur un port personnalisé
Il s'exécute sur le port 8983 par défaut. Vous pouvez modifier le port ici ou directement à l'intérieur du
jetty.xml
fichier.java -Djetty.port=9091 -jar start.jar
Téléchargez JConnector
Ce fichier JAR agit comme un pont entre MySQL et JDBC, téléchargez la version indépendante de la plateforme 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/contrib/dataimporthandler/lib
Création de la table MySQL à lier à Apache Solr
Pour utiliser Solr , vous devez disposer de tableaux et de 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 se connecter à MySQL et indexer cette table et ses entrées.
1. structure du tableau
2. remplir le tableau ci-dessus
Entrer dans le noyau et ajouter les directives lib
1. Naviguez vers
2.Modification du solrconfig.xml
Ajoutez ces deux directives à ce fichier.
Ajoutez maintenant le DIH (Data Import Handler)
3.Créez le fichier db-data-config.xml
Si le fichier existe, ignorez-le, 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, le nom d'utilisateur et le mot de passe de la base de données.
4.Modifiez le fichier schema.xml
Ajoutez ceci à votre schema.xml comme indiqué.
Indexage
C'est où la vraie affaire est. Vous devez effectuer l'indexation des données de MySQL vers Solr afin d'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.
Comme l'indique le marqueur, accédez à Connexion pour vérifier si l'une des configurations ci-dessus a entraîné des erreurs.
Étape 2: vérifiez vos journaux
Ok donc 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 , disons que s'il y avait des erreurs sur cette requête, cela se serait affiché ici.
Très bien, pas d'erreurs. Nous sommes prêts à partir. Choisissons collection1 dans la liste comme illustré 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 à partir de l' interface Solr et récupérerez les 10 enregistrements de la base de données qui sera indexée sur Solr .
Pour ce faire, choisissez l' importation complète et cochez les options Nettoyer et valider . Maintenant, cliquez sur Exécuter comme indiqué.
Vous pouvez également utiliser une requête d' importation complète directe comme celle-ci également.
Une fois que vous avez cliqué sur Exécuter , Solr commence à indexer les enregistrements.S'il y a eu des erreurs, l' indication Échec de l'indexation indique que vous devez revenir à la section Journalisation pour voir ce qui ne va pas.
En supposant qu'il n'y a pas d'erreur avec cette configuration et si l'indexation est terminée avec succès., Vous obtiendrez cette notification.
Étape 4: exécution des requêtes Solr
Il semble que tout se soit bien passé, vous pouvez désormais utiliser Solr Queries pour interroger les données indexées. Cliquez sur la requête sur la gauche, puis appuyez sur Exécuter sur le bouton en bas.
Vous verrez les enregistrements indexés comme indiqué.
La requête Solr correspondante pour répertorier tous les enregistrements est
Eh bien, il y a les 10 enregistrements indexés. Disons, nous n'avons besoin que des noms commençant par Ja , dans ce cas, vous devez cibler le nom de la colonne
solr_name
, c'est pourquoi votre requête se présente comme suit.Voilà comment vous écrivez des requêtes Solr . Pour en savoir plus, consultez ce bel article .
la source
Je regarde la recherche en texte intégral de PostgreSQL en ce moment, et elle a toutes les bonnes fonctionnalités d'un moteur de recherche moderne, un très bon caractère étendu et une prise en charge multilingue, une belle intégration étroite avec les champs de texte dans 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 comporte des termes de correspondance en gras dans les extraits de résultats, l'algorithme par défaut pour lequel les termes de correspondance ne sont pas excellents. De plus, si vous voulez indexer rtf, PDF, MS Office, vous devez trouver 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 que j'ai vus, Lucene / Solr et Sphinx sont vraiment super . Ils sont du code solide et ont évolué avec des améliorations significatives de la convivialité, donc les outils sont tous là pour faire une recherche qui satisfait presque tout le monde.
pour SHAILI - SOLR inclut la bibliothèque de codes de recherche Lucene et a les composants pour être un joli moteur de recherche autonome.
la source
Tsearch
. Mais Tsearch ne prend pas en charge la recherche de phrases. Il est toujours sur leur liste TODO sai.msu.su/~megera/wiki/FTS_Todo .Juste mes deux cents pour cette très vieille question. Je recommande fortement de jeter un œil à ElasticSearch .
Les avantages par rapport aux autres moteurs FTS (recherche plein texte) sont:
Nous utilisons ce moteur de recherche dans notre projet et nous en sommes très satisfaits.
la source
SearchTools-Avi a déclaré: "Recherche de texte MySQL, qui n'indexe même pas les mots de trois lettres ou moins."
Pour info, la longueur minimale des mots en 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 MySQL a ses limites: d'une part, la mise à jour est lente une fois que vous atteignez un million d'enregistrements, ...
la source
J'ajouterais 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 crochets pour avoir une qualité de recherche maximale. Il pourrait également extraire les données directement de la base de données.
La solution n'est pas si connue aujourd'hui, mais elle satisfait les besoins maximaux. Vous pouvez le compiler et l'installer ou sur un serveur autonome, ou même sur votre serveur principal, il n'a pas besoin d'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, donc cela nécessite des connaissances. J'ai fait un petit script pour Debian, qui pourrait aider. Tout ajustement est le bienvenu.
Comme vous utilisez le framework Django, vous pourriez utiliser ou un client PHP au milieu, ou trouver une solution en Python, j'ai vu quelques articles .
Et, bien sûr, mnoGoSearch est open source, GNU GPL.
la source