ES中使用nested类型的内嵌对象

2020-05-29 00:00:00 查询 文档 对象 信息 嵌套

在 Elasticsearch 中处理关联关系

关系型数据库,一般会考虑 Normalize 数据;在 Elasticsearch,往往考虑 Denormalize 数据

Denormalize 的好处:读的速度变快、无需表连接、无需行锁

Elasticsearch 并不擅长处理关联关系,我们一般采用以下四种方法处理关联

对象类型

嵌套对象(Nested Object)

父子关联关系(Parent 、Child)

应用端关联

案例 1:

对象类型

在每个博客的问下中都保留作者的信息

如果作者信息发生变化,需要修改相关的博客文档

PUT /blog
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      },
      "time": {
        "type": "date"
      },
      "user": {
        "properties": {
          "city": {
            "type": "text"
          },
          "userid": {
            "type": "long"
          },
          "username": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

# 插入一条 Blog 信息
PUT blog/_doc/1
{
  "content":"I like Elasticsearch",
  "time":"2019-01-01T00:00:00",
  "user":{
    "userid":1,
    "username":"Jack",
    "city":"Shanghai"
  }
}
通过一条查询语句即可获取到博客和作者信息
# 查询 Blog 信息
POST blog/_search
{
"query": {
"bool": {
  "must": [
    {"match": {"content": "Elasticsearch"}},
    {"match": {"user.username": "Jack"}}
  ]
}
}
}

相关文章