query - Combinando Neo4j y Elasticsearch
term match elasticsearch (2)
Estoy usando Neo4j como mi base de datos principal. Es una buena base de datos de gráficos que me da un buen control sobre las conexiones entre nodos. Sin embargo, parece que le falta mucho para buscar texto completo (función de búsqueda en un sitio web). Y, por lo tanto, estoy pensando en utilizar Elasticsearch para crear una función de búsqueda en mi aplicación. Pero hay algunos problemas al hacer esto. Digamos que estamos buscando publicaciones de usuarios. En neo4j posts podría tener el siguiente modelo.
(post)<-[:AUTHOR]-(user)
(post)-[:LIKED_BY]->(otherusers)
(post)-[:COMMENTED_BY]->(otherusers)
(post)-[:HAS_PHOTO]->(photos)
Lo bueno de Neo4j (digamos al obtener publicaciones en un perfil de usuario) es que puedes tomar todo esto a la vez (también una foto de perfil y detalles de usuario mientras estás en eso y si ya te ha gustado la publicación). Eso es un montón de detalles en una consulta (comando de cifrado). Ahora, si queremos dar el mismo nivel de detalle a la salida de Elasticsearch, puedo pensar en lo siguiente en este momento:
Almacene todo en Neo4j y Elasticsearch. Cuando se busca un texto, enumere los resultados de elasticsearch. Pero todavía hay problemas como obtener si el usuario ya le ha gustado la publicación (¿esto podría necesitar consultar neo otra vez para cada publicación? Esto no suena tan bien)
Almacenar la identificación de la publicación en Elasticsearch. Al completar los resultados de búsqueda, obtenga la información de cada publicación de la base de datos neo4j con esta identificación de publicación y muestre los resultados. (10 resultados -> 10 llamadas separadas, suena muy ineficiente de nuevo)
Obtenga una lista de los identificadores que proporciona Elasticsearch y haga 1 llamada a neo4j y obtenga resultados (no sé cómo hacerlo o si hay problemas de rendimiento). Una referencia de cifrado podría ser útil.
¿Alguna solución aparte de estas? Estos suenan un poco ineficientes.
Esta es una pregunta un poco basada en la opinión porque no tiene una respuesta "correcta", así que prepárense para que el martillo SO no divertido se caiga ... pero he estado pensando en uno-dos ( Elasticsearch luego Neo) punch es la mejor manera de manejar esto: indexe propiedades en Elasticsearch, realice una búsqueda de texto completo para obtener posibles ID, luego cree una coincidencia de Cypher que limite los resultados a los ID devueltos.
En Cypher, puede usar IN []
para devolver registros que coincidan dentro de una matriz. Entonces usted podría hacer MATCH (u:Student { age: 30 }) WHERE ID(u) IN [1, 2, 3, 4] RETURN u
. El truco de integrar Elasticsearch con Neo, entonces, es facilitar la creación de consultas de Cypher en torno a los resultados de ES. Realmente no tengo consejos para hacer eso porque dependerá de tu lenguaje y tu controlador.
En Neo4j.rb, estoy pensando en tratar de automatizar esto para que pueda hacer esto:
student.lessons(:l).where(name: ''Chris'').to_a
... y sabrá que el modelo de la Lección usa Elasticsearch, hace la consulta y luego cambia la consulta para el usuario, por lo que es efectivamente esto:
student.lessons(:l).where(''ID(l) IN {elasticsearch_results}'').params(elasticsearch_results: [1, 2, 3, 4]).to_a`
He estado usando Searchkick para buscar texto completo con Neo y me ha estado yendo bien. Creo que esto es factible No es una solución a su problema, pero es la forma en que estoy pensando en ello, así que tal vez le dé algunas ideas.
Vale la pena señalar que Neo tiene búsqueda difusa usando =~
, simplemente no usa índices, por lo que puede haber un golpe de rendimiento. Sin embargo, esto podría no ser un problema, ya que puede filtrar la cantidad de nodos y propiedades que Cypher debe inspeccionar agregando más información a otras partes de su consulta. Debe hacer algunos puntos de referencia con sus datos para determinar si la sobrecarga adicional de Elasticsearch y las consultas más complicadas son necesarias.
También estoy buscando la integración de Neo4J y Elasticsearch. He visto "Neo4j River Plugin for ElasticSearch". Pero no sé cómo usarlo. Si encuentran alguna información sobre la integración con "Neo4j River Plugin for ElasticSearch", háganmelo saber, serán de gran ayuda.