Elasticsearch实战学习笔记系列 Elasticsearch文档间的关系
目录
Elasticsearch实战学习笔记系列 Elasticsearch文档间的关系
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据
Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索
Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系
一、定义文档间关系的选项概览
1.对象类型
文档最终是像下面这样进行索引的
{
”name”:“Denver technology group”,
”events.date”: [”2014-12-22”, “2014-06-20”],
”events.title”: [”Introduction to Elasticsearch”,”Introduction to Hadoop”]
}
假设你想过滤于2014年12月主办过Hadoop会议的分组, 查询可以是这样的
"bool": {
"must": [
{
"term": {
"events.title": "hadoop"
}
},
{
"range": {
"events.date": {
"from":"2014-12-01",
"to":"2014-12 -31"
}
}
}
]
}
2.嵌套类型
如果想避免这种跨对象的匹配的发生,可以使用嵌套类型 (nested type),它将活动索引到分隔的 Lucene 文档。
3.父子关系
通过父子关系,你可以使用完全不同的 Elasticsearch 文档, 将它们放在不同的类型 ,并在每种类型的映射中定义它们之间的关系 。
4.反规范化
还有一些非Elasticsearch特有的技术,NoSQL 数据存储会用其来弥补连接( join )的不足:其中一个就是反规范化(denormalizing)。以分组和其中的会员为例 ,一个分组可以拥有多于一个的会员,一个用户也可以成为多个分组的会员。分组和会员都有它们 自己的一组属性,为了表示这种关系,可以让分组成为会员的父辈 。对于身为多个分组会员的用户而言,可以反规范化他们的数据 : 每次表示一个其所属分组
替换的方案是,可以将分组和会员各自单独保存,在分组文档中只包含会员的 ID。 可以在应用程序中根据会员ID来连接(join)分组及其会员。 如果所要查询的会员ID数量很小,这样操作也能很好地运作
二、将对象作为字段值
Elasticsearch 中的文档可以是层次型的, Lucene 只支持扁平结构
{
"title":"Using Hadoop with Elasticsearch",
"location" {
"name":”SkillsMatter Exchange",
"geolocation":"51.524806, -0.099095"
}
}
1.映射和索引对象
2.在对象中搜索
默认情况下,你需要设置所查找的字段路径,来引用内部对象,如 location.name
3.总结
使用对象来定义文档间关系
优点
- 容易使用 不必为了索引对象而进行任何特殊的定义
- 查询和聚集对象 就像处理扁平结构的文档那样
- 无须使用连接join 所有的内容都属于同一篇文档
缺点
- 对象之间没有边界 需要考虑其他选择类似嵌套类型、父子关系以及反规范化,并最终将它们和对象相结合
- 更新一个单独的对象,需要重新索引整篇文档
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据