在Elasticsearch中是否有类似于连接的查询?

时间:2017-09-01 06:48:35

标签: elasticsearch join

我知道在Elasticsearch中使用“JOIN”效率不高,但我需要使用它。 我必须通过查找索引A和索引B的相同字段来提取值。 下面有一个例子。

A/type1/1
{
“serial”:“abc”,
“member”:“jack”
}

A/type1/2
{
“serial”:“def”,
“member”:“jack”
}

B/type2/1
{
“serial”:“abc”,
“temp”:1
}

B/type3/2
{
“serial”:“abc”,
“water”:0
}

B/type2/3
{
“serial”:“def”,
“temp”:10
}

我需要过滤A索引的'member'字段的值来找到相应的serial,然后我想得到temp和{{1的值B索引中的字段。 ex)过滤器:water ===> {“member”:“jack”}

我想知道我是否能得到这个结果,如果是这样,我如何建立数据结构(索引结构)。

1 个答案:

答案 0 :(得分:1)

如果可能的话,你肯定应该做评论者Val建议的,非规范化(展平)你的数据。我建议,例如,您可以使用这样的文档(基本上,在索引之前加入):

B/type2/1 {"serial": "abc", "temp": 1, "member": "jack"}
B/type2/2 {"serial": "abc", "water": 0, "member": "jack"}
B/type2/3 {"serial": "def", "temp": 10, "member": "jack"}

然后,如果您搜索{"match": {"member": "jack"}},您将获得所有这些文件。有两种方法可以做"加入"在Elasticsearch中,parent-child relationshipsnested objects。以下是如何使用嵌套对象创建映射的示例:

{
  "type1": {
    "properties": {
      "serial": {"type": "keyword"},
      "member": {"type": "keyword"},
      "type2s": {
        "type": "nested",
        "properties": {
          "temp": {"type": "integer"},
          "water": {"type": "integer"}
        }
      }
    }
  }
}

然后你会存储这样的记录:

{
  "serial": "abc",
  "member": "jack",
  "type2s": [
    {
      "temp": 1
    },
    {
      "water": 0
    }
  }
}

但是,我强烈建议你不要这样做,除非你绝对必须这样做!这是一个好主意的用例很少见。它使您的数据查询更加复杂,而且效率低下(因此,您的数据会扩展,您将很快就会遇到问题)。

我知道"重复"感觉不对数据。在关系数据库中这将是一种可怕的做法。您必须开发一种不同的思维方式,以便在Elasticsearch中进行有效和高效的数据建模,其中一个不同之处在于您不必过于担心重复数据。