如何增加网站外链,做公众号关注网站,网站建设 昆明 价格,wordpress 京东客nested
嵌套类型
数据的某个值是json、object对象#xff1b;不再是简单的数据类型#xff0c;或者简单数据类型的数组#xff1b;那么还用之前的查询方式就有问题了。因为ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表 。此时#xff0c;需要用n…nested
嵌套类型
数据的某个值是json、object对象不再是简单的数据类型或者简单数据类型的数组那么还用之前的查询方式就有问题了。因为ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表 。此时需要用nested进行查询
扁平化存储
用法
使用nested查询的时候在设置mapping的时候也要指定字段类型为nested PUT index_name
{mappings: {properties: {nested_field_name: {type: nested}}}
} 查询 GET /my-index-000001/_search
{query: {nested: {path: obj1,query: {bool: {must: [{ match: { obj1.name: blue } },{ range: { obj1.count: { gt: 5 } } }]}},score_mode: avg}}
} pathnested对象的查询深度 score_mode评分计算方式 avg 默认使用所有匹配的子对象的平均相关性得分。 max使用所有匹配的子对象中的最高相关性得分。 min使用所有匹配的子对象中最低的相关性得分。 none不要使用匹配的子对象的相关性分数。该查询为父文档分配得分为0。 sum将所有匹配的子对象的相关性得分相加。 Join
父子级关系
join和nested一样需要在设置mapping的时候设置字段类型 mapping PUT msb_depart
{mappings: {properties: {msb_join_field: {type: join,relations: {depart: employee}},my_id: {type: keyword}}}
} 插入父级数据 PUT msb_depart/_doc/1
{my_id: 1,name:教学部,msb_join_field:{name:depart}
}
PUT msb_depart/_doc/2
{my_id: 2,name:咨询部,msb_join_field:{name:depart}
} 连接数据类型是一个特殊字段它在同一索引的文档中创建父/子关系。关系部分在文档中定义了一组可能的关系每个关系是一个父名和一个子名
插入子级数据需要指定routing路由因为父文档和子文档必须在同一个分片建立索引
插入子级数据 PUT msb_depart/_doc/3?routing1refresh
{my_id: 3,name:马老师,msb_join_field:{name:employee,parent:1}
}
PUT msb_depart/_doc/4?routing1refresh
{my_id: 4,name:周老师,msb_join_field:{name:employee,parent:1}
} 搜索所有父级数据 GET msb_depart/_search
{query: {has_child: {type: employee,query: {match_all: {}}}}
} 搜索所有子级 {query: {has_parent: {parent_type: depart,query: {match: {name.keyword: 咨询部}}}}
} join类型不能像关系数据库中的表链接那样去用不论是has_child或者是has_parent查询都会对索引的查询性能有严重的负面影响。并且会触发global ordinals
join唯一合适应用场景是当索引数据包含一对多的关系并且其中一个实体的数量远远超过另一个的时候。
关联关系处理优先级
Objectnestedjoin
Object类型
通俗点就是通过字段冗余以一张大宽表来实现粗粒度的index这样可以充分发挥扁平化的优势。但是这是以牺牲索引性能及灵活度为代价的。
使用的前提冗余的字段应该是很少改变的比较适合与一对少量关系的处理。
当业务数据库并非采用非规范化设计时这时要将数据同步到作为二级索引库的ES中就很难使用上述增量同步方案必须进行定制化开发基于特定业务进行应用开发来处理join关联和实体拼接
嵌套对象
索引性能和查询性能二者不可兼得必须进行取舍。嵌套文档将实体关系嵌套组合在单文档内部类似与json的一对多层级结构
这种方式牺牲索引性能文档内任一属性变化都需要重新索引该文档来换取查询性能可以同时返回关系实体比较适合于一对少量的关系处理。当使用嵌套文档时使用通用的查询方式是无法访问到的必须使用合适的查询方式nested query、nested filter、nested facet等很多场景下使用嵌套文档的复杂度在于索引阶段对关联关系的组织拼装
父子级关系
父子文档牺牲了一定的查询性能来换取索引性能适用于一对多的关系处理。其通过两种type的文档来表示父子实体父子文档的索引是独立的。父-子文档ID映射存储在 Doc Values 中。当映射完全在内存中时 Doc Values 提供对映射的快速处理能力另一方面当映射非常大时可以通过溢出到磁盘提供足够的扩展能力。 在查询parent-child替代方案时发现了一种filter-terms的语法要求某一字段里有关联实体的ID列表。基本的原理是在terms的时候对于多项取值如果在另外的index或者type里已知主键id的情况下某一字段有这些值可以直接嵌套查询。
具体可参考官方文档的示例通过用户里的粉丝关系微博和用户的关系来查询某个用户的粉丝发表的微博列表。