Comparaison du moteur de recherche plein texte-Lucene, Sphinx, Postgresql, MySQL?
je construis un site Django et je cherche un moteur de recherche.
quelques candidats:
-
Lucene/Lucene avec Boussole/Solr
-
Postgresql recherche dans le texte intégral
-
MySQl intégré de recherche en texte intégral
Critères de sélection:
- la pertinence de résultat et le classement des
- vitesse de recherche et d'indexation
- facilité d'utilisation et facilité d'intégration avec Django
- besoins en ressources-site sera hébergé sur un VPS , donc idéalement le moteur de recherche ne nécessiterait pas beaucoup de RAM et CPU
- évolutivité
- caractéristiques supplémentaires telles que " voulez-vous dire?", recherches connexes, etc
quiconque a de l'expérience avec les moteurs de recherche ci-dessus, ou d'autres moteurs qui ne sont pas dans la liste -- j'aimerais entendre vos opinions.
modifier: en ce qui concerne les besoins d'indexation, que les utilisateurs continuent à entrer des données dans le site, ces données devraient être indexées en permanence. Il n'est pas nécessaire que ce soit en temps réel, mais idéalement de nouvelles données apparaîtraient dans l'index avec un délai de 15 à 30 minutes
8 réponses
C'est bien de voir quelqu'un parler de Lucene - parce que je n'en ai aucune idée.
Sphinx, d'un autre côté, je sais très bien, alors voyons si je peux vous aider.
- classement de la pertinence des résultats est la valeur par défaut. Vous pouvez configurer votre propre tri si vous le souhaitez, et donner des pondérations plus élevées à des champs spécifiques.
- vitesse D'indexation est super-rapide, parce qu'il parle directement à la base de données. Toute la lenteur va proviennent de requêtes SQL complexes et de clés étrangères non indexées et d'autres problèmes similaires. Je n'ai jamais remarqué de lenteur dans la recherche.
- je suis un gars des Rails, donc je n'ai aucune idée de la facilité avec Django. Il y a une API Python qui vient avec la source Sphinx.
- le démon de service de recherche (searchd) est assez faible sur l'utilisation de la mémoire - et vous pouvez fixer des limites sur combien de mémoire le processus d'indexeur utilise aussi.
- L'évolutivité est là où ma connaissance est plus vague - mais il est assez facile de copier des fichiers d'index à plusieurs machines et exécuter plusieurs démons de recherche. L'impression générale que j'ai de la part des autres, c'est que c'est sacrément bon avec une charge élevée, donc l'étalage sur plusieurs machines n'est pas quelque chose qui doit être traité.
- il n'y a pas de support pour 'did-you-mean', etc - Bien que cela puisse être fait avec d'autres outils assez facilement. Sphinx n' mots-tiges bien qu'utilisant des dictionnaires, donc 'driving' et 'drive' (par exemple) seraient considérés les mêmes dans les recherches.
- Sphinx ne permet pas les mises à jour partielles d'index pour les données de terrain cependant. L'approche commune est de maintenir un indice delta avec toutes les modifications récentes, et de le ré-indexer après chaque modification (et ces nouveaux résultats apparaissent dans une seconde ou deux). En raison de la petite quantité de données, ce qui peut prendre quelques secondes. Vous aurez toujours besoin de ré-indexer le principal ensemble de données régulièrement cependant (bien que dépend régulièrement de la volatilité de vos données - tous les jours? à l'heure?). La vitesse d'indexation rapide maintient tout cela assez indolore cependant.
Je n'ai aucune idée de comment applicable à votre situation, mais Evan Weaver a comparé quelques-unes des options de recherche de Rails communs (Sphinx, Ferret (un port de Lucene pour Ruby) et Solr), l'exécution de certains benchmarks. Pourrait être utile, je pense.
Je n'ai pas sondé les profondeurs de la recherche en texte intégral de MySQL, mais je sais qu'elle ne rivalise pas avec Sphinx, Lucene ou Solr.
Je ne connais pas Sphinx, mais en ce qui concerne Lucene vs une recherche plein texte de base de données, je pense que la performance de Lucene est inégalée. Vous devriez être en mesure de faire presque n'importe quelle recherche en moins de 10 ms, peu importe le nombre d'enregistrements que vous devez rechercher, à condition que vous avez mis en place votre index de Lucene correctement.
voici le plus grand obstacle cependant: personnellement, je pense que L'intégration de Lucene dans votre projet n'est pas facile . Bien sûr, il est pas trop difficile de le configurer pour que vous puissiez faire une recherche de base, mais si vous voulez en tirer le meilleur parti, avec une performance optimale, alors vous avez vraiment besoin d'un bon livre sur Lucene.
en ce qui concerne les exigences CPU & RAM, effectuer une recherche dans Lucene ne charge pas trop 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), de sorte que ce n'est pas beaucoup d'un obstacle.
il ne répond pas à toutes vos questions mais bref, si vous avez beaucoup de données à rechercher, et que vous voulez une bonne performance, alors je pense que Lucene est définitivement la voie à suivre. Si vous n'avez pas autant de données à rechercher, alors autant faire une recherche en texte intégral dans une base de données. Mettre en place 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'information postée sur Solr. Solr est tout à fait similaire à Sphinx mais a des fonctionnalités plus avancées (AFAIK que je n'ai pas utilisé Sphinx -- seulement lire à son sujet).
la réponse au lien ci-dessous détaille quelques choses sur Sphinx qui s'applique également à Solr. Comparaison de la totalité du texte pour les moteurs de recherche Lucene, Sphinx, Postgresql, MySQL?
Solr fournit également les suivants supplémentaires caractéristiques:
- prend en charge la réplication
- plusieurs noyaux (pensez à ceux-ci comme des bases de données séparées avec leur propre configuration et leurs propres index)
- recherches booléennes
- 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)
- mettre à Jour l'index via XML ou un fichier délimité par des
- communiquer avec le serveur de recherche via HTTP (il peut même retourner Json, natif PHP / Ruby / Python)
- PDF, indexage de documents Word
- Dynamique des champs
- facettes
- l'ensemble des champs
- mots D'arrêt, synonymes, etc.
- plutôt comme ça...
- Index directement à partir de la base de données avec des requêtes personnalisées
- Auto-suggérer
- Cache Autowarming
- indexage rapide (comparer aux temps D'indexage MySQL pour la recherche en texte intégral) -- Lucene utilise un format d'index inversé binaire. "151990920 de surpression (règles personnalisées pour l'accroissement de la pertinence d'un mot clé ou une phrase, etc.)
- recherche par champ (si un utilisateur de recherche connaît le champ qu'il / elle veut rechercher, il / elle restreint sa recherche en tapant le champ, puis la valeur, et seulement que le champ est recherché plutôt que tout -- bien meilleure expérience de l'utilisateur)
BTW, il y a des tonnes de plus de fonctionnalités; cependant, j'ai énuméré juste les fonctionnalités que j'ai réellement utilisé dans la production. BTW, hors de la boîte, MySQL prend en charge #1, #3, et #11 (limité) sur la liste ci-dessus. Pour les fonctionnalités que vous recherchez, une base de données relationnelle ne va pas le couper. Je les éliminerais tout de suite.
aussi, un autre avantage est que le Solr (bien, Lucene actually) est une base de données de documents (par exemple NoSQL) de sorte que beaucoup des 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 que juste la recherche (de la Performance). Faire preuve de créativité avec elle :)
Apache Solr
en plus de répondre aux questions de OP, Permettez-moi de jeter quelques idées sur Apache Solr de introduction simple à installation détaillée et mise en œuvre .
Simple Introduction
quiconque a de l'expérience avec les moteurs de recherche ci-dessus, ou autre moteurs pas dans la liste -- j'aimerais entendre vos opinions.
Solr ne doit pas être utilisé pour résoudre des problèmes en temps réel. Pour les moteurs de recherche, Solr est assez jeu et fonctionne sans faille .
Solr fonctionne très bien sur les applications web à haut trafic ( j'ai lu quelque part qu'il n'est pas adapté pour cela, mais je suis la sauvegarde de cette déclaration ). Il utilise la RAM, pas le CPU.
- la pertinence de résultat et le classement des
le boost vous aide à classer vos résultats apparaissent sur le dessus. Dites, vous êtes essayer de rechercher un nom john dans les champs firstname et lastname , et vous voulez donner pertinence au champ firstname , alors vous avez besoin de boost vers le haut du firstname comme indiqué.
http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john
comme vous pouvez le voir, prénom le champ est boosté haut avec un score de 2.
plus sur Solrlevancy
- vitesse de recherche et d'indexation
la vitesse est incroyablement rapide et aucun compromis à ce sujet. La raison pour laquelle j'ai déménagé à Solr .
en ce qui concerne la vitesse d'indexation, Solr peut également gérer jointures de vos tables de base de données. Un plus élevé et complexe de" joindre affecte la vitesse d'indexation. Cependant, un énorme RAM config peut facilement s'attaquer à cette situation.
plus la RAM est haute, plus la vitesse d'indexation de Solr est rapide.
- facilité d'utilisation et facilité d'intégration avec Django
N'a jamais essayé de intégrer Solr et Django , mais vous pouvez y parvenir avec Haystack . J'ai trouvé quelque intéressant article sur le même et voici le github pour lui.
- besoins en ressources-site sera hébergé sur un VPS, donc idéalement le moteur de recherche ne nécessiterait pas beaucoup de RAM et de CPU
Solr se reproduit sur RAM, donc si le RAM est élevé, vous n'avez pas à vous soucier de Solr .
"Solr L'utilisation de la mémoire vive augmente sur l'indexation complète si vous avez quelques milliards de disques, vous pourriez intelligemment faire usage de Delta imports pour faire face à cette situation. Comme expliqué, Solr "1519340920 n'est qu'une solution en temps quasi réel .
- évolutivité
Solr est très évolutif. Jetez un oeil sur SolrCloud . Certaines des principales caractéristiques de celui-ci.
- Fragments (ou la fragmentation est le concept de la distribution de l'indice entre plusieurs machines, dire si votre index est devenu trop grand)
- équilibrage de la charge (si Solrj est utilisé avec Solr cloud il s'occupe automatiquement de l'équilibrage de la charge en utilisant son mécanisme de rotation)
- Recherche Distribuée
- Haute Disponibilité
- caractéristiques supplémentaires telles que " voulez-vous dire?", recherches connexes, etc
Pour le scénario ci-dessus, vous pouvez utiliser le SpellCheckComponent qui est emballé avec Solr . Il ya beaucoup d'autres caractéristiques, Le SnowballPorterFilterFactory aide à récupérer des dossiers disent Si vous avez tapé, livres au lieu de Livre , vous serez présenté avec des résultats liés à Livre .
Cette réponse largement axé sur la Apache Solr & MySQL . Django est hors de portée.
en supposant que vous êtes sous environnement LINUX, vous pouvez passer à cet article plus loin. (le mien était un Ubuntu 14.04 version)
Installation Détaillée
Pour Commencer
Télécharger Apache Solr à partir de ici . Que serait la version est 4.8.1 . Vous pourriez télécharger de nouvelles versions, j'ai trouvé cette stable.
après avoir téléchargé l'archive , extrayez-la dans le dossier de votre choix.
Dire. . Downloads
ou autre.. Donc il ressemblera à Downloads/solr-4.8.1/
à votre demande.. Naviguer dans le répertoire
shankar@shankar-lenovo: cd Downloads/solr-4.8.1
donc 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 exemples du répertoire solr-4.8.1
, donc naviguez à l'intérieur de cela et démarrez le serveur D'Application Jetty.
shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar
ne fermez pas le terminal, minimisez-le et laissez-le de côté.
( ASTUCE : Utiliser et après le départ.pot pour faire de la Jetty Server fonctionne dans le l'arrière-plan )
pour vérifier si Apache Solr fonctionne avec succès, visitez cette URL sur le navigateur. http://localhost:8983/solr
Running Embarcadère de Port personnalisé
s'exécute par défaut sur le port 8983. Vous pouvez changer le port soit ici, soit directement dans le fichier jetty.xml
.
java -Djetty.port=9091 -jar start.jar
télécharger le Jconnecteur
ce fichier JAR agit comme un pont entre MySQL et JDBC , Téléchargez la version indépendante de la plate-forme ici
après l'avoir téléchargé, extraire le dossier et copier le mysql-connector-java-5.1.31-bin.jar
et le coller dans le répertoire lib .
shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib
Création de la base de données MySQL tableau à relier à Apache Solr
mettre Solr à utiliser, Vous avez besoin d'avoir des tables et des données de la recherche. Pour cela, nous utiliserons MySQL pour créer une table et pousser quelques noms aléatoires, puis nous pourrions utiliser Solr pour se connecter à MySQL et indexer cette table et ses entrées.
1.Structure Du Tableau 15192930920"
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.Remplir 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.Naviguer vers
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf
2.Modifier le solrconfig.xml
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
ajoute 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 des 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éer le db-données-config.fichier xml
si le fichier existe, puis ignorer, ajouter ces lignes à ce fichier. Comme vous pouvez voir la première ligne, vous devez fournir les justificatifs d'identité de votre base de données MySQL . 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>
(astuce : vous pouvez avoir n'importe quel nombre d'entités mais attention au champ id, si elles sont identiques, l'indexation sera ignorée. )
4.Modifier le schéma.fichier xml
ajoutez ceci à votre schéma .xml comme indiqué..
<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />
mise en œuvre
indexation
C'est là que se trouve la vraie affaire. Vous devez effectuer l'indexation des données de MySQL à Solr afin d'utiliser les requêtes Solr.
Étape 1: Aller au panneau D'administration Solr
Frapper l'URL http://localhost:8983/solr sur votre navigateur. L'écran s'ouvre comme ceci.
comme le marqueur indique, passez à Logging afin de vérifier si l'une des configurations ci-dessus a conduit à 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, sur notre configuration, nous avons ajouté une requête select sur notre db-données-config.xml , de dire s'il y avait des erreurs sur cette requête, il aurait montré jusqu'ici.
très bien, pas d'erreurs. Nous sommes bon pour aller. Choisissons collection1 dans la liste telle que représentée et sélectionnez Dataimport
Étape 3: DIH (Gestionnaire d'Importation des Données)
en utilisant le DIH, vous vous connecterez à MySQL de Solr à travers le fichier de configuration db-data-config.xml de l'interface Solr et extraire les 10 enregistrements de la base de données qui est indexée sur Solr .
Pour ce faire, Choisissez plein d'importation , et cocher les options Propre et Commit . Maintenant, cliquez sur exécuter comme indiqué.
alternativement, vous pouvez utiliser une requête directe full-import comme ceci aussi..
http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true
après que vous avez cliqué sur exécuter , Solr commence à indexer les enregistrements, s'il y avait des erreurs, il dirait indexage échoué et vous devez retourner à la section Logging pour voir ce qui a mal tourné.
en supposant qu'il n'y ait pas d'erreurs avec cette configuration et que l'indexation soit terminée avec succès. tu recevrais cette notification.
Étape 4: Exécution De Requêtes Solr
semble comme tout s'est bien passé, maintenant vous pouvez utiliser Solr requêtes pour interroger les données qui ont été indexées. Cliquez sur Query à gauche, puis appuyez sur Execute bouton en bas.
, Vous verrez les enregistrements indexés comme indiqué.
le Solr requête pour lister tous les dossiers est
http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true
Eh bien, voilà les 10 dossiers indexés. Par exemple, nous n'avons besoin que de noms commençant par Ja , dans ce cas, vous devez cibler le nom de la colonne solr_name
, donc votre requête va comme ceci.
http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true
C'est la façon dont vous écrivez Solr Requêtes. Pour en savoir plus, consultez ce beau article .
je regarde la recherche PostgreSQL plein texte en ce moment, et il a toutes les bonnes caractéristiques d'un moteur de recherche moderne, vraiment bon caractère étendu et le soutien multilingue, l'intégration étroite nice avec des champs de texte dans la base de données.
mais il n'a pas d'opérateurs de recherche conviviaux comme + ou et (utilisations &/!) et je ne suis pas ravie de la façon dont cela fonctionne sur leur site de documentation. Alors qu'il y a une mise en gras des termes de correspondance dans les extraits de résultats, la valeur par défaut est algorithme pour lequel les termes de correspondance ne sont pas grands. Aussi, 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 /
In tous les cas que j'ai vu, Lucene/Solr et Sphinx sont vraiment grand . Ils sont un code solide et ont évolué avec des améliorations significatives de la convivialité, de sorte que les outils sont tous là pour faire la recherche qui satisfait presque tout le monde.
pour SHAILI-SOLR inclut la bibliothèque de codes de recherche de Lucene et a les composants pour être un moteur de recherche autonome agréable.
Juste mes deux cents pour cette très vieille question. Je recommande vivement de jeter un oeil à ElasticSearch .
Elasticsearch est un serveur de recherche basé sur Lucene. Il fournit un moteur de recherche en texte intégral distribué et multi-tenant avec une interface Web reposante et des documents JSON sans schéma. Elasticsearch est développé en Java et est publié en open source sous les termes de la licence Apache.
Les avantages par rapport à d'autres FTS (recherche plein texte) les Moteurs sont:
- RESTful interface
- meilleure évolutivité
- Grande communauté
- construit par Lucene les développeurs de
- Vaste documentation
- Il y a beaucoup de bibliothèques open source disponibles (y compris Django)
nous utilisons ce moteur de recherche à notre projet et très heureux avec elle.
SearchTools-Avi dit "MySQL de recherche de texte, qui n'a même pas d'index mots de trois lettres ou moins."
FYIs, la longueur de mot min en texte intégral MySQL est réglable depuis au moins MySQL 5.0. Google " fulltext mysql min de la longueur des instructions simples.
cela dit, MySQL fulltext a des limites: pour un, il est lent à mettre à jour une fois que vous atteignez un million d'enregistrements ou ainsi, ...
j'ajouterais mnoGoSearch à la liste. Solution extrêmement performante et flexible, qui fonctionne comme Google: indexer récupère des données à partir de plusieurs sites, vous pouvez utiliser des critères de base, ou inventer vos propres crochets pour avoir une qualité de recherche maximale. Il peut aussi extraire les données directement à partir de la base de données.
la solution n'est pas si connue aujourd'hui, mais elle feets besoins maximum. Vous pouvez compiler et les installer 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 compiler vous-même, il nécessite donc un certain savoir. J'ai fait un tout petit script Pour Debian, ce qui pourrait aider. Tout ajustement est le bienvenu.
comme vous utilisez Django framework, vous pourriez utiliser ou client PHP au milieu, ou trouver une solution en Python, j'ai vu certains articles .
et, bien sûr, mnoGoSearch est open source, GNU GPL.