【问题标题】:Is there a query similar to joins in Elasticsearch?有没有类似 Elasticsearch 中的 join 的查询?
【发布时间】:2018-02-10 04:33:55
【问题描述】:

我知道在 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,然后我想得到B中tempwater字段的值指数。 例如)过滤器:{“member”:“jack”} ===> temp:1, water:0, temp:10

不知道能不能得到这个结果,如果能,如何建立数据结构(索引结构)。

【问题讨论】:

标签: elasticsearch join


【解决方案1】:

如果可能的话,您绝对应该按照评论者 Val 的建议去做,非规范化(扁平化)您的数据。例如,我建议您可以使用这样的文档(基本上,在 before 索引之前进行连接):

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 中进行有效和高效的数据建模,其中一个区别是您不必太担心重复数据。

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-04-16
    相关资源
    最近更新 更多