乐闻世界logo
搜索文章和话题

Elasticsearch 中的“嵌套数据类型”是什么?

1 个月前提问
1 个月前修改
浏览次数14

1个答案

1

在 Elasticsearch 中,“嵌套数据类型”(nested data type)是一种特殊的数据类型,用于索引数组中包含对象的字段。这种数据类型特别适合处理那些每个对象都需要被独立索引和查询的情况。

普通的 JSON 对象数组在 Elasticsearch 中是不能保证对象之间的边界的。例如,假设有一个文档字段是人员信息,其中包括多个角色和与每个角色相关联的技能。在不使用嵌套类型的情况下,如果你试图查询具有特定角色和对应技能的人员,可能会得到错误的结果,因为 Elasticsearch 默认会将角色和技能视为两个独立的数组,它们的组合是平面的。

使用嵌套数据类型,每个数组元素(对象)都被视为一个独立的隐藏文档,这样就可以准确地对每个对象进行索引和查询,从而避免了错误的关联结果。

举个例子,考虑以下文档结构:

json
{ "person_id": 1, "name": "John Doe", "roles": [ { "role": "developer", "skills": ["Java", "Elasticsearch"] }, { "role": "designer", "skills": ["Photoshop", "Illustrator"] } ] }

在这种情况下,如果我们想要查找角色为 "developer" 且技能包括 "Elasticsearch" 的人员,如果没有正确使用嵌套类型,查询可能会错误地返回那些角色为 "developer" 但技能不包括 "Elasticsearch" 的人员,因为技能和角色被平面化处理。

要在 Elasticsearch 中实现这种查询,我们需要在映射时将 roles 字段定义为嵌套类型:

json
{ "mappings": { "properties": { "roles": { "type": "nested", "properties": { "role": { "type": "text" }, "skills": { "type": "keyword" } } } } } }

然后,我们可以使用嵌套查询来精确查找:

json
{ "query": { "nested": { "path": "roles", "query": { "bool": { "must": [ { "match": { "roles.role": "developer" } }, { "term": { "roles.skills": "Elasticsearch" } } ] } } } } }

这个查询能够确保只返回正确的文档,即那些角色为 "developer" 且技能包括 "Elasticsearch" 的人员。这就是 Elasticsearch 中嵌套数据类型的用处和重要性。

2024年8月13日 22:00 回复

你的答案