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 如果嵌套了多层,可以类似地将子层包含至父层

搜索和聚集嵌套文档
- 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"}
}"
}
网友评论