Solr vs Hibernate Search - Qui à choisir et à quel moment?

nous sommes en train de construire une application de commerce électronique. Nous utilisons JAVA stack avec Hibernate et Spring Framework. Comme pour toute application de commerce électronique, nous avons besoin de construire une capacité de recherche dans le nôtre.

donc, nous sommes tombés sur Hibernate Search et Apache Solr . Est-ce que quelqu'un peut énumérer les avantages et les inconvénients des deux pour que nous puissions choisir la solution idéale pour la recherche D'entreprise?

28
demandé sur ThinkingStiff 2011-05-20 11:32:55

6 réponses

Apache Solr est principalement utilisé pour la recherche plein texte: si vous voulez trouver des mots (singulier et pluriel par exemple) dans un grand ensemble de documents où la taille de chaque doc est d'un paragraphe à quelques pages. Solr peut ne pas être mieux qu'une base de données régulière si vous ne l'utilisez pas pour la recherche de texte, mais seulement pour la recherche int et varchar.

ce lien pourrait vous être utile:

http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html

7
répondu Bob Yoplait 2012-11-22 11:33:41

dites que vous utilisez hibernate pour la couche persistante de votre application web avec une configuration basée sur l'annotation. Ensuite, vous pouvez utiliser les mêmes classes de modèles(comme celle que j'ai donnée ci-dessous) utilisées pour l'annotation pour les définir dans le serveur Solr en utilisant l'annotation spécifique au serveur Solr.

je vais vous donner un exemple où cela est fait.

La classe

suivante est une classe de modèle client sans les annotations Solr .

@Entity
@Table(name="Customer")
public class Customer {

    private int customerId;
    private String customerName;
    private String customerAddress;


    @Id     
    public int getCustomerId() {
        return customerId;
    }
    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }
    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }



}

permet maintenant d'annoter cette classe avec les annotations Solr pour indexer les détails des clients dans Solr Server.

@Entity
@Table(name="Customer")
public class Customer {
    @Field
    private int customerId;
    @Field
    private String customerName;
    @Field
    private String customerAddress;


    @Id     
    public int getCustomerId() {
        return customerId;
    }
    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }
    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }



}

vient de mettre l'attribut @Field pour filed que vous voulez indexé dans le serveur Solr.

alors le problème est de savoir comment dire à solr d'indexer ce modèle. il peut être fait comme suit.

dire que vous allez persister un client appelé alex dans la base de données, puis nous allons ajouter des données à l'alex comme suit

Customer alex = new Customer();
alex.setCustomerName("Alex Rod");
alex.setCustomerAddress("101 washington st, DC");

et, après avoir sauvegardé cet objet alex dans la base de données, vous devez dire à solr d'indexer cet objet de données. il se fait comme suit.

session.save(alex);

        session.getTransaction().commit();


        String url = "http://localhost:8983/solr";
        SolrServer server = null;
        try {
            server = new CommonsHttpSolrServer(url);
            server.addBean(alex);
            server.commit();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

tout est dans l'indexation solr avec L'utilisation de la technologie D'hibernation. c'est assez simple.j'ai expliqué l'idée de base de la façon de l'utiliser. j'ai eu cet exemple d'une application commerciale où nous avons utilisé la méthode ci-dessus pour mettre en œuvre la fonctionnalité de recherche

16
répondu KItis 2011-05-31 08:21:27

en plus de ce qui a été dit, Quand dans un environnement groupé:

Hibernate-recherche:

Inconvénients:

  • nécessite une combinaison maître/esclave qui n'est pas toujours réalisable, spécialement lorsque votre processus de construction/déploiement ne distingue pas entre les noeuds (même guerre pour tous les noeuds).
  • les index sont hébergés dans le même serveur / processus que l'application exécuter Hibernate, donc vous avez un index par noeud d'application. C'est parfois exagéré.
  • ce n'est pas une recherche en temps réel, à moins que l'équilibreur de charge utilise la rigidité de session.

Pour:

  • Zéro à peu de configuration. Laisse tomber le bocal dans le chemin de la classe.
  • le pont entre Hibernate et Lucene est très simple. Juste annoter les Entités et voilá!

Solr/SolrCloud:

  • il est découplé de l'application elle-même.
  • pas de recherche en temps réel, tout comme la recherche en hibernation.
  • nécessite un redémarrage pour changer le schéma.
  • SolrCloud n'est pas exactement le framework le plus facile à configurer.
  • Non de droite vers l'avant veille prolongée pont. Vous devez coder votre propre écouteur D'hibernation et liez-les aux événements post-[insert|delete|update] (ou trouvez un événement open source)

ElasticSearch

  • les serveurs sont indépendants de l'application, tout comme solr.
  • C'est de loin le plus facile à configurer dans un cluster/cloud.
  • Il est en temps réel
  • pas de pont D'hibernation droit devant. (es-hibernate-connecteur sur GitHub)

personnellement, je préfère ElasticSearch quand je cours dans le nuage.

15
répondu Franklin Dattein 2014-06-26 12:36:11

il y a une autre alternative qui consiste à les utiliser ensemble et à combiner leurs pros ensemble.

Jetez un oeil à: combinant le pouvoir de recherche Hibernate et Solr

Je les utilise ensemble et ça marche très bien.

Hibernate search me fournit toutes les annotations d'entités & analyse et les changements de collecte dans les limites de transaction tandis que Solr me fournit le meilleur moteur de recherche avec une grande caractéristiques 1:m facettes, clusters, etc...

5
répondu Avner Levy 2012-11-05 14:33:21

cela ressemble à vous besoin de lire sur le pour et le contre de chacun de ceux-ci. Il y a beaucoup de documentation disponible.

si vous voulez mon avis, je dirais qu'il est logique d'utiliser hibernation recherche avec hibernation. La mise à jour des index de recherche se produit lorsque hibernate exécute des opérations de base de données et seulement lorsqu'une transaction de base de données est engagée.

1
répondu Alex Barnes 2011-05-20 16:48:40

Hibernate search est un "pont" entre Hibernate et Lucene . En d'autres termes, il rend persisté entités Hibernate automatiquement les recherches dans l'index Lucene.

Solr est un cadre construit sur le Sommet de Lucène (les deux projets sont censés être fusionnés un jour, mais c'est un long chemin à parcourir). Les différences entre Solr et Lucene sont expliquées dans un autre so post .

1
répondu mindas 2017-05-23 12:09:42