8

我知道在弹性搜索中,我们可以在文档之间建立子/父关系

然后,在索引时,我可以传递父 id,以便将子文档和父文档链接起来:

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

无论如何在elasticsearch中建模多对多关系?

数据位于具有以下架构的 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与我的 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')

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

无论如何在elasticsearch中建模多对多关系?

4

2 回答 2

12

没有办法对多对多关系进行建模。

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

Elasticsearch 非常高效,所以很多时候,重新索引是一个可以接受的解决方案。此外,elasticsearch 具有文档的概念,并且不是关系存储系统,因此多对多关系可能永远不会实现。

于 2012-08-10T09:07:15.817 回答
0

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

您需要仔细考虑应用程序中读取与写入的比率,并确定总体上更有效的方法。最后,无论是在写入数据时,还是在读取数据时,都需要完成连接所有关系的工作。

于 2013-11-14T00:43:48.060 回答