弹性搜索中的多对多关系

时间:2012-08-06 06:13:45

标签: many-to-many elasticsearch

我知道在弹性搜索中,文档之间可以有child/parent relationships

然后,在编制索引时,我可以传递父ID,以便链接子文档和父文档:

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

无论如何在弹性搜索中建立多对多的关系?

数据驻留在具有以下架构的MySQL数据库中:

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.

这是我account的映射(请原谅数组符号,我在PHP中使用Elastica与我的弹性搜索服务器通信):

**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')

这种方法的问题在于,如果从索引中删除组,我将需要遍历每个帐户并从每个帐户中删除组ID。这对我来说似乎有点低效。我还假设在使用elasticsearch的子/父关系时这不会成为问题。

有没有在弹性搜索中建立多对多关系的模型?

2 个答案:

答案 0 :(得分:11)

没有办法模拟多对多关系。

唯一的方法是在每个帐户中存储每个组的ID,就像我上面所做的那样。

Elasticsearch非常有效,因此重建索引通常是一种可接受的解决方案。此外,elasticsearch具有文档的概念,而不是关系存储系统,因此可能永远不会实现多对多关系。

答案 1 :(得分:0)

当您考虑效率时,您需要考虑的是写入时间与读取时间效率。关系数据库有利于写入时效率,而NoSQL则有利于读取时间效率。

您需要仔细考虑应用程序中读取与写入的比率,并确定整体效率更高的内容。最后,在写入数据或读取数据时,需要做一些加入所有关系的工作。