Comparaison des moteurs de recherche plein texte - Lucene, Sphinx, Postgresql, MySQL?

312

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

Continuation
la source
26
2 ¢: La recherche et les transactions en texte intégral MySQL s'excluent (actuellement) mutuellement. Les index de texte intégral MySQL nécessitent le type de table MyISAM, qui ne prend pas en charge les transactions. (Par opposition au type de table InnoDB qui prend en charge les transactions, mais pas les index de texte intégral.)
Carl G
2
La recherche de texte intégral PostgreSQL Tsearch ne prend pas en charge la recherche de phrases. Cependant, il figure sur la liste TODO sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam
1
Quiconque regarde ceci pour Django devrait vérifier l'application haystack. haystacksearch.org
Keyo
24
@CarlG, juste pour la référence de tout le monde. MySQL 5.6+ prend en charge la recherche de texte intégral avec le moteur innodb
DhruvPathak

Réponses:

167

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.

  • Le classement de la pertinence des résultats est la valeur par défaut. Vous pouvez configurer votre propre tri si vous le souhaitez et attribuer des pondérations plus élevées à des champs spécifiques.
  • La vitesse d'indexation est super rapide, car elle communique directement avec la base de données. Toute lenteur proviendra de requêtes SQL complexes et de clés étrangères non indexées et d'autres problèmes de ce type. Je n'ai jamais remarqué de lenteur dans les recherches 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) utilise assez peu de mémoire - et vous pouvez également définir des limites sur la quantité de mémoire utilisée par le processus d'indexation.
  • L'évolutivité est l'endroit où ma connaissance est plus sommaire - 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'ai des autres est que c'est sacrément bon sous une charge élevée, donc la faire évoluer sur plusieurs machines n'est pas quelque chose qui doit être traité.
  • 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 dérive les mots en utilisant des dictionnaires, donc «conduire» et «conduire» (par exemple) seraient considérés comme les mêmes dans les recherches.
  • Sphinx n'autorise pas les mises à jour d'index partielles pour les données de champ. L'approche courante consiste à maintenir un indice delta avec tous les changements récents et à le réindexer après chaque changement (et ces nouveaux résultats apparaissent dans une seconde ou deux). En raison de la petite quantité de données, cela peut prendre quelques secondes. Vous devrez néanmoins réindexer régulièrement l'ensemble de données principal (bien que la fréquence dépende de la volatilité de vos données - tous les jours? Toutes les heures?). Les vitesses d'indexation rapides gardent tout cela assez indolore.

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.

tapoter
la source
Sphinx vous permet de mettre à jour les attributs individuels des éléments dans les index actuels, mais pas de supprimer / mettre à jour les enregistrements complets.
Xorlev
sphinx RT vous permet d'effectuer des mises à jour / suppressions partielles. il est à un stade précoce mais fonctionne déjà [presque]. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd
4
Voici une réponse sur Solr qui est une bonne paire à cette réponse sur Sphinx
New Alexandria
Rien ne peut égaler Sphinx pour la vitesse, donc si la vitesse est votre préoccupation numéro un, alors Sphinx est l'option à privilégier. Nice post
twigg
Sphinx 2.3.2 Beta a maintenant une fonctionnalité appelée «CALL SUGGEST» qui peut être utilisée pour implémenter «vous vouliez dire? sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K
82

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.

Razzie
la source
10
Comparé au sphinx, la lucence est trop lente et encombrante. J'avais utilisé les deux dans mon projet et je suis finalement resté fidèle au sphinx. Lucence est en java, et il prend beaucoup plus de CPU et de RAM que Sphinx.
Phyo Arkar Lwin
25
Je dois être en désaccord ici. Lucene est rapide comme l'éclair SI vous construisez un index correct. Vous pouvez essentiellement effectuer une requête avancée sur des millions d'enregistrements en seulement quelques millisecondes. Vous avez juste besoin de savoir ce que vous faites. Et Lucene est en Java ... votre point est? Il y a aussi le port .NET, Lucene.NET btw.
Razzie
15
mais vous avez clairement indiqué que vous n'utilisez pas sphinx, et v3sson a utilisé les deux.
user508546
20
comment pouvez-vous affirmer que la performance de lucene est inégalée dans la même phrase que vous déclarez que vous n'avez pas utilisé le sphinx?
user508546
22
Questions valides. Je n'ai jamais dit que Lucene est plus rapide que Sphinx, j'ai mentionné que Lucene vs une recherche de texte intégral dans une base de données est inégalée. Et c'est. Cela ne fait aucun doute. Lucene est basée sur un index inversé. Maintenant, je ne connais pas Sphinx, comme mentionné précédemment, mais s'il utilise également un index inversé ou une méthode d'indexation similaire, il est possible qu'ils fonctionnent également. Déclarer que Lucene, par rapport à Sphinx, serait «trop lent et encombrant» n'est pas basé sur des faits. Surtout pas quand on dit seulement que Lucene est en «Java», ce qui est juste un non-problème ridicule en termes de performances.
Razzie
60

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:

  1. Prend en charge la réplication
  2. Plusieurs cœurs (pensez à ceux-ci 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 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. 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 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. Autowarming du cache
  16. Indexation rapide (par rapport aux temps d'indexation de la recherche en 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 la recherche connaît le champ qu'il souhaite rechercher, il affine sa recherche en tapant le champ, puis la valeur, et UNIQUEMENT ce champ est recherché plutôt que tout - bien meilleure expérience utilisateur)

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

Wil Moore III
la source
Sphinx aussi sur Prise en charge de la réplication Cœurs multiples Recherches booléennes Mise en évidence des mots-clés Mise à jour de l'index via XML - ou fichier délimité - PDF, indexation de documents Word (via xml) Facettes Mots stop, synonymes, etc. Index directement depuis la base de données avec des requêtes personnalisées Suggestion automatique rapide indexation Boosting Recherches sur le terrain À propos des champs dynamiques Champs agrégés Cache Autowarming Je ne sais pas
Moosh
58

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 .

Introduction simple


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.

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.

  • pertinence et classement des résultats

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é.

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

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

Plus sur SolrRelevancy

  • 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é 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.

  • 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 et voici le github pour cela.

  • 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

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 .

  • évolutivité

Solr est hautement évolutif. Jetez un oeil sur SolrCloud . Quelques caractéristiques clés de celui-ci.

  • Shards (ou sharding est le concept de distribution de l'index entre plusieurs machines, par exemple si votre index est devenu trop grand)
  • Équilibrage de charge (si Solrj est utilisé avec le cloud Solr, il s'occupe automatiquement de l'équilibrage de charge en utilisant son mécanisme Round-Robin)
  • Recherche distribuée
  • La haute disponibilité
  • fonctionnalités supplémentaires telles que "vouliez-vous dire?", recherches associées, etc.

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)

Installation détaillée

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 .. Downloadsou 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.1ré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é.

(CONSEIL: utilisez & après start.jar pour exécuter Jetty Server en arrière-plan)

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.xmlfichier.

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.jaret 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

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. Naviguez vers

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

2.Modification du solrconfig.xml

Ajoutez ces deux directives à ce fichier.

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

Ajoutez maintenant le DIH (Data Import Handler)

<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, 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.

<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 n'importe quel nombre d'entités mais faites attention au champ id, si elles sont identiques, l'indexation sera 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 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.

Il s'agit du principal panneau d'administration d'Apache Solr

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.

Ceci est la section de journalisation de votre moteur Apache Solr

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.

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

Le gestionnaire d'importation de données

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.

Succès de l'indexation

É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

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

Les données indexées

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.

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

Les données JSON commençant par Ja *

Voilà comment vous écrivez des requêtes Solr . Pour en savoir plus, consultez ce bel article .

Shankar Damodaran
la source
3
@Downvoter, n'hésitez pas à commenter ou modifier cette réponse et le raisonnement pour le downvote aidera aussi les autres.
Shankar Damodaran
4
c'est l'un des articles les plus complets et les mieux organisés que j'ai vus sur SO. Emploi super.
dégénéré
28

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.

SearchTools-Avi
la source
1
Je pense que par la recherche en texte intégral de PostgreSQL vous faites référence 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 .
Gnanam
1
Je viens de faire un tas de tests sur la recherche en texte intégral de Postgres 9.0; a été déçu de constater que le texte français ne correspondait pas si l'utilisateur oublie d'obtenir tous les accents. La correspondance des formes de mots est inégale - par exemple, en anglais, "say" ne correspond pas au texte contenant "said". Globalement assez impressionnant cependant pour une fonctionnalité intégrée dans les langues testées (en, fr, ru).
Roman Starkov
9
@romkyns: vous devez installer un dictionnaire non accentué pour les supprimer.
Denis de Bernardy
2
"OTOH, c'est bien mieux que la recherche de texte MySQL, qui n'indexe même pas les mots de trois lettres ou moins." Ce n'est pas une restriction intégrée de MySQL - c'est tout ce que vous définissez dans le fichier de configuration. Si vous souhaitez indexer des mots d'une lettre, changez simplement une valeur dans la configuration.
Canuck
1
Il est inquiétant que les gens comparent des bases de données qu'ils n'ont pas encore complètement explorées. MySQL PEUT indexer les mots avec trois caractères ou moins - il vous suffit de le configurer correctement.
TheCarver
22

Juste mes deux cents pour cette très vieille question. Je recommande fortement de jeter un œil à ElasticSearch .

Elasticsearch est un serveur de recherche basé sur Lucene. Il fournit un moteur de recherche en texte intégral distribué et multi-locataire avec une interface Web RESTful 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 aux autres moteurs FTS (recherche plein texte) sont:

  • 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 sommes très satisfaits.

vooD
la source
10

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, ...

BJ.
la source
2

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.

Fedir RYKHTIK
la source