2012-08-06 12 views
7

Sé que en elasticsearch, podemos tener child/parent relationships entre documentos.Muchas a muchas relaciones en elasticsearch

Y luego, cuando se indexa, puedo pasar el ID de padre para que los documentos hijos y padres están vinculados:

$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{ "tag" : "something"}' 

¿Hay alguna forma para modelar una relación de muchos a muchos en elasticsearch?

datos es reside en una base de datos MySQL con el siguiente esquema:

account 
======== 
id 
name 
some_property 

group 
======== 
id 
name 
description 

account_group 
============= 
account_id 
group_id 
primary_group //This is 1 or 0 depending on whether the group is the primary group for that account. 

Esta es actualmente mi asignación para account (disculpen la notación de matriz, estoy usando Elastica en PHP para hablar con mi servidor elasticsearch) :

**Mapping for account** 

'name' => array(
    'type' => 'string'), 

'some_property' => array(
    'type' => 'string'), 

'groups' => array(
    'properties' => array(
    'id'  => array('type' => 'integer'), 
    'primary' => array('type' => 'boolean') 
    ) 
), 

**Mapping for group** 

'name' => array(
     'type' => 'string'), 

'description'=> array(
     'type' => 'string') 

el problema con este enfoque es que si un grupo se elimina del índice, que tendrá que pasar por cada cuenta y eliminar el ID de grupo de cada cuenta. Esto parece ser un poco ineficiente para mí. También supongo que esto no sería un problema al usar las relaciones hijo/padre de elasticsearch.

¿Hay alguna forma de modelar relaciones de muchos a muchos en elasticsearch?

Respuesta

10

No hay forma de modelar las relaciones entre varios.

La única forma es almacenar la identificación de cada grupo en cada cuenta como lo he hecho anteriormente.

Elasticsearch es bastante eficiente, muchas veces, reindexar es una solución aceptable. Además, elasticsearch tiene la noción de documentos y no es un sistema de almacenamiento relacional, por lo que probablemente nunca se implementarían las relaciones de muchos a muchos.

0

Cuando piensa en la eficiencia, lo que debe tener en cuenta es el tiempo de escritura frente a la eficiencia del tiempo de lectura. Las bases de datos relacionales favorecen la eficiencia del tiempo de escritura, mientras que NoSQL favorece la eficiencia del tiempo de lectura.

Debe considerar cuidadosamente la relación de lectura vs escritura en su aplicación, y determinar qué será más eficiente en general. Al final, algo tiene que hacer el trabajo de unir todas las relaciones, ya sea cuando se escriben los datos o cuando se leen los datos.

Cuestiones relacionadas