Question

Nous avons une application hébergée qui gère les pages de contenu. Chaque page peut comporter un certain nombre de champs personnalisés et certains champs standard (horodatage, nom d'utilisateur, courrier électronique d'utilisateur, etc.).

Avec des centaines de sites différents utilisant le système, quel est le moyen efficace de gérer le filtrage / la recherche? Imaginez une vue de la grille que vous souhaitez affiner. Vous pouvez filtrer des champs spécifiques (ID utilisateur, date) ou saisir une recherche en texte intégral.

Par exemple, "toutes les pages commencées par l'ID utilisateur 10". serait une requête assez rapide contre une base de données MySQL. Mais des choses comme "toutes les pages commencées par un utilisateur dont l'ID utilisateur est 10 et correspond à [une requête de recherche]" serait nul contre la base de données, donc il convient à un moteur de recherche comme Lucene.

En gros, je me demande comment d’autres grands sites font ce genre de chose. Utilisent-ils un moteur de recherche à 100% pour tous les types de filtrage? Est-ce qu'ils mélangent les requêtes de base de données avec un moteur de recherche?

Si nous utilisons uniquement un moteur de recherche, le temps nécessaire pour qu'un nouvel objet / un objet mis à jour apparaisse dans l'index de recherche pose un problème. En d’autres termes, j’ai lu qu’il n’était pas judicieux de mettre à jour l’index immédiatement et de le faire par lots. Même si cela signifie toutes les 5 minutes, les utilisateurs s'embrouillent lorsque leur page récemment ajoutée ne figure pas immédiatement dans la liste lorsqu'ils affichent une simple liste de pages (par exemple, une requête de recherche de "catégorie: 5").

Nous utilisons MySQL et examinons de près les recherches de Lucene. Existe-t-il une autre technologie que je ne connais pas?

Je pensais proposer une simple page de filtrage utilisant MySQL pour filtrer les champs de base. Ensuite, proposez une page de recherche en texte intégral séparée qui présenterait des résultats similaires à ceux de Google. Est-ce le seul moyen?

Était-ce utile?

La solution

Solr ou grassyknoll fournissent tous deux des interfaces légèrement plus abstraites à Lucene.

Cela dit: Oui. Si vous êtes un site principalement axé sur le contenu et proposant une recherche en texte intégral sur vos données, il y a quelque chose en jeu qui dépasse LIKE. Bien que les index FULLTEXT de MySQL ne soient pas parfaits, il s’agit peut-être d’un espace réservé acceptable dans l’intervalle.

En supposant que vous créiez un index Lucene, lier Lucene Documents à vos objets relationnels est assez simple, ajoutez simplement une propriété stockée au document au moment de l'index (cette propriété peut être une URL, un ID, un GUID, etc.). devient un système à 2 phases: 1) Émettre une requête à Lucene indexies (Afficher les résultats simples comme le titre) 2) Obtenez des informations plus détaillées sur l'objet de vos magasins relationnels par leur clé

Étant donné que l’instanciation de Documents est relativement coûteuse dans Lucene, vous ne souhaitez stocker que les champs recherchés dans l’index de Lucene, par opposition aux clones complets de vos objets relationnels.

Autres conseils

Ne supprimez pas MySQL si facilement!

Implémentez-le à l'aide de la base de données, par exemple. une sélection avec un 'comme' dans la clause where ou autre chose.

Profilez-le, ajoutez des index si nécessaire. Déployez une version bêta pour obtenir des chiffres réels à partir des modèles de données réels de l'utilisateur. Toutes les colonnes ne peuvent pas être posées de la même manière, etc.

.

Si la performance est mauvaise, c'est alors que vous envisagez d'autres options. Vous pouvez envisager d’optimiser votre code SQL, votre base de données, la machine sur laquelle la base de données s’exécute et enfin d’utiliser une autre pile technologique ...

Si vous souhaitez utiliser MySQL ou PostgreSQL, Sphinx est une solution open source qui fonctionne très bien: http://www.sphinxsearch.com/

Nous avons le même problème et considérons Sphinx et Lucene comme des solutions possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top