2012-08-06 11 views
7

Wiem, że w elastycznym badaniu, możemy mieć child/parent relationships między dokumentami.Wiele do wielu relacji w elasticssearch

A potem, podczas indeksowania, mogę przekazać id rodzica tak, że dziecko i rodzic są powiązane dokumenty:

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

Czy mimo modelować wiele do wielu relacji w elasticsearch?

danych jest rezyduje w bazie danych MySQL za pomocą następującego schematu:

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. 

Jest to obecnie mój mapowanie dla account (proszę wybaczyć notacji tablicy używam Elastica w PHP mówić do mojego serwera 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') 

problem z tego podejścia jest to, że jeśli grupa zostanie usunięta z indeksu, będę musiał przejść przez każdego konta i usunąć identyfikator grupy z każdego konta. To wydaje mi się trochę nieskuteczne. Zakładam też, że nie byłoby to problemem przy stosowaniu relacji dziecko/rodzic elasticsearch.

Czy istnieje sposób modelowania relacji wielu do wielu w badaniu elastycznym?

Odpowiedz

10

Nie można modelować relacji między wieloma osobami.

Jedynym sposobem jest zapisanie identyfikatora każdej grupy na każdym koncie, tak jak to zrobiłem powyżej.

Elasticsearch jest dość efektywny, dlatego często reindeksowanie jest akceptowalnym rozwiązaniem. Ponadto elasticsearch ma pojęcie dokumentów i nie jest relacyjnym systemem pamięci masowej, więc relacje wiele do wielu prawdopodobnie nigdy nie zostaną zaimplementowane.

0

Kiedy myślisz o wydajności, musisz wziąć pod uwagę czas zapisu i wydajność w czasie odczytu. Relacyjne bazy danych faworyzują czas zapisu, a NoSQL sprzyjają wydajności czasu odczytu.

Należy dokładnie rozważyć stosunek odczytu do zapisu w aplikacji i określić, co będzie bardziej skuteczne. W końcu coś musi wykonać pracę łączenia wszystkich relacji, albo gdy dane są zapisywane, albo kiedy dane są czytane.