美文网首页
Elasticsearch实战第八章 文档间的关系

Elasticsearch实战第八章 文档间的关系

作者: kaiker | 来源:发表于2021-12-12 14:01 被阅读0次

1、定义文档间关系的选项

对象类型

将JSON对象数组作为对象的值
但是这种存储会把对象里相同key的数据打平放到一起,同一个对象内部的关系丢失

对象类型存储

嵌套类型

保持独立的Lucene文档,会把每个文档分隔开

嵌套类型

父子关系

在每种类型的映射汇总定义它们之间的关系

反规范化

一篇文档包含所有相关数据

2、将对象作为字段值

映射和索引对象

会把对象字段解析成嵌套样式,内部对象也有properties列表,和根json对象一样

在对象中搜索

对象.字段,这样使用,搜索的方式和普通字段一样
只有在一个字段中搜索的时候,系统才能正常地查询。对象之间没有边界

3、嵌套类型

系统将跟文档和所有的嵌套类型对象分别索引到多个分隔的文档,但系统仍会将它们放在同一个单独的分块。

映射并索引嵌套文档

需要指定类型nested

"members":{
    "type": "nested",
    "properties":"{
        "first_name": {"type":"string"},
        "last_name": {"type":"string"}
    }"
}
  • include_in_root 可以让对象索引两次,一次作为根节点的对象类型,一次作为嵌套类型
  • include_in_parent 如果嵌套了多层,可以类似地将子层包含至父层
include in parent

搜索和聚集嵌套文档

  • nested查询和过滤器,需要制定path参数,让ES知道嵌套对象位于哪里的Lucene分块中。
"query":{
    "nested":{
        "path":"member",
        "query":{}
    }
}
  • 如果有多级嵌套的结构,可以指定到子嵌套
"query":{
    "nested":{
        "path":"members.comments",
        "query":{}
    }
}
  • 整合嵌套对象的得分,如果一个分组里匹配上了嵌套里的部分文档,要获取一个整体分组的得分,可以整合嵌套对象的得分
  • 可以通过返回的inner_hits字段查看谁被匹配上了
  • 聚集,也可反向聚集访问父辈或根文档
"aggregations":{
    "members":{
        "nested":{
            "path":"members"
        },
        "aggregations":{
            "frequent_members":{
                "field":"members.name"
            }
        }
    }
}
  • 由于需要进行额外的工作来链接同一个分块中的多篇文档,性能会有损失

4、父子关系

父辈按照正常的索引方式,子辈需要在_parent字段中指定父辈的ID
父辈与子辈是完全不同的文档,只能分别搜索,效率更低
但是文档索引、更新删除更方便,嵌套则需要重新索引整个分组

子文档的索引、更新和删除

  • 映射需要指定父辈的类型
  • 索引和检索,parent值是它们所属分组文档的ID,需要指定

父文档和子文档中搜索

  • has_child,是搜索有某种子文档的父文档,先过滤出子文档,再通过子文档指向的父文档进行过滤最后得到
  • has_parent,先运行父辈结果,然后返回子辈

5、反规范化

复制数据来避免链接

索引、更新和删除反规范化数据

"member":{
    "_parent":{"type":"group"},
    "properties":"{
        "first_name":{"type":"string"}
    }"
}

相关文章

网友评论

      本文标题:Elasticsearch实战第八章 文档间的关系

      本文链接:https://www.haomeiwen.com/subject/wqyrfrtx.html