example - Solr vs Hibernate Search-¿Qué elegir y cuándo?
hibernate search spring (6)
Además de lo que se ha dicho, cuando se está en un entorno agrupado:
Búsqueda de Hibernate:
Contras:
- Requiere una combinación maestro / esclavo que no siempre es factible, especialmente cuando el proceso de compilación / implementación no distingue entre los nodos (la misma guerra para todos los nodos).
- Los índices están alojados en el mismo servidor / proceso que la aplicación que ejecuta Hibernate, por lo que tiene un índice por nodo de aplicación. Esto a veces es excesivo.
- No es una búsqueda en tiempo real, a menos que el equilibrador de carga utilice la coherencia de la sesión.
Pros:
- Cero a poca configuración. Solo deja caer el jar en el classpath.
- El puente entre Hibernate y Lucene es muy directo. Simplemente anota las Entidades y ¡voilá!
Solr / SolrCloud:
- Está desacoplado de la aplicación en sí mismo.
- No es una búsqueda en tiempo real, como la búsqueda de hibernación.
- Requiere reiniciar para cambiar el esquema.
- SolrCloud no es exactamente el marco más fácil de configurar.
- No hay puente Hibernate directo. Tienes que codificar tu propio oyente de Hibernate y vincularlos a los eventos post- [insert | delete | update] (o encontrar uno de código abierto)
ElasticSearch
- Los servidores son independientes de la aplicación, al igual que solr.
- Es, de lejos, el más fácil de configurar en un clúster / nube.
- Es en tiempo real
- No hay puente Hibernate directo, también. (conector es-hibernate en GitHub)
Personalmente prefiero ElasticSearch cuando se ejecuta en la nube.
Estamos construyendo una aplicación de comercio electrónico. Estamos utilizando JAVA stack con Hibernate y Spring Framework. Al igual que con todas las aplicaciones de comercio electrónico, necesitamos desarrollar capacidades de búsqueda en las nuestras.
Entonces, nos encontramos con Hibernate Search y Apache Solr . ¿Puede alguien enumerar los pros y los contras de ambos para que podamos seleccionar la solución ideal para Enterprise Search?
Apache Solr se utiliza principalmente para la búsqueda de texto completo: si desea encontrar palabras (singular y plurales, por ejemplo) en un gran conjunto de documentos donde el tamaño de cada documento va de un párrafo a unas pocas páginas. Es posible que Solr no sea mejor que una base de datos normal si no la utiliza para la búsqueda de texto, sino solo para la búsqueda int y varchar.
Este enlace puede serle útil:
http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html
Digamos que está utilizando hibernate para la capa persistente de su aplicación web con configuración basada en anotaciones. Luego, puede usar las mismas clases de modelo (como la que proporcioné a continuación) que se usa para la anotación para establecer el índice en el servidor Solr utilizando la anotación específica del servidor Solr.
te daré un ejemplo de dónde se hace esto.
La siguiente clase es una clase de modelo de cliente sin anotaciones de 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;
}
}
Ahora, anotemos esta clase con anotaciones de Solr para indexar los detalles del Cliente en 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;
}
}
Simplemente coloque el atributo @Field para el archivo que desea indexar en el servidor Solr.
Entonces, el problema es cómo decirle a Solr que indexe este modelo. se puede hacer de la siguiente manera.
Digamos que va a persistir un cliente llamado alex en la base de datos, luego agregaremos datos al alex de la siguiente manera
Customer alex = new Customer();
alex.setCustomerName("Alex Rod");
alex.setCustomerAddress("101 washington st, DC");
y, después de guardar este objeto alex en la base de datos, necesita decirle a solr que indexe este objeto de datos. se hace de la siguiente manera.
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();
}
Todo esto se trata de la indexación de solr con el uso de la tecnología Hibernate. es bastante directo. Te he explicado la idea básica de cómo usarlo. Obtuve este ejemplo de una aplicación comercial donde utilizamos el método anterior para implementar la funcionalidad de búsqueda
Existe otra alternativa que es usarlos juntos y combinar sus pros juntos.
Eche un vistazo a: Combinando el poder de Hibernate Search y Solr
Los estoy usando juntos y funciona bien.
La búsqueda de Hibernate me proporciona todas las entidades, anotaciones y análisis y colección de cambios en los límites de las transacciones, mientras que Solr me proporciona el mejor motor de búsqueda con excelentes características como facetas 1: m, clusters, etc.
La búsqueda de Hibernate es un "puente" entre Hibernate y Lucene . En otras palabras, hace que las entidades persistentes de Hibernate puedan buscarse automáticamente en el índice Lucene.
Solr es un marco construido sobre Lucene (se supone que ambos proyectos se fusionarán un día, pero aún queda mucho camino por recorrer). Las diferencias entre Solr y Lucene se explican en otra publicación SO .
Parece que necesita leer los pros y los contras de cada uno de estos. Hay una extensa documentación disponible.
Si quisiera mi opinión, diría que tiene sentido usar Hibernate Search con Hibernate. La actualización de los índices de búsqueda se produce cuando hibernación realiza operaciones de base de datos y solo cuando se compromete una transacción de base de datos.