Elasticsearch 中的 Nested 类型字段如何使用,有哪些适用场景?

Sherwin.Wei Lv8

Elasticsearch 中的 Nested 类型字段如何使用,有哪些适用场景?

回答重点

在 Elasticsearch 中,嵌套类型(Nested Type)字段是一种特殊的数据类型,用来存储复杂的 JSON 对象结构。这种类型与对象类型(Object Type)相似,但其索引方式是不同的。Nested 类型字段在索引时会将每个子文档单独索引,从而保证查询时关联特性能够正确工作。

使用 Nested 类型字段时,可以在查询中进行高效的嵌套查询(nested query),确保嵌套文档的相关性得到正确处理。适用场景包括需要存储和查询具有多重层次结构的复杂 JSON 对象,例如商品属性、用户评论等。

扩展知识

1)简介和基本用法
在创建索引时可以定义嵌套类型字段。例如,有以下商品信息需要存储,每个商品有多个不同的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /my_index
{
"mappings": {
"properties": {
"product": {
"type": "nested",
"properties": {
"name": { "type": "keyword" },
"attributes": {
"type": "nested",
"properties": {
"color": { "type": "keyword" },
"size": { "type": "keyword" }
}
}
}
}
}
}
}

2)嵌套查询
定义嵌套类型后,可以使用嵌套查询来进行检索。例如,要查询具有特定颜色和大小的商品属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GET /my_index/_search
{
"query": {
"nested": {
"path": "product.attributes",
"query": {
"bool": {
"must": [
{ "match": { "product.attributes.color": "red" } },
{ "match": { "product.attributes.size": "large" } }
]
}
}
}
}
}

这样可以确保查询条件针对的是同一个嵌套对象,而不是不同嵌套对象的组合。

3)适用场景

  • 复杂对象的存储和查询: 比如电商系统中的商品,具有多层次的属性结构。
  • 日志系统: 一个日志记录可能包含多个来源信息或事件,每个信息和事件同样具有多个字段。
  • 用户评论和评级系统:每个用户的评论和评级分别是一个独立的嵌套结构。

4)性能考虑
由于每个嵌套文档被单独索引,所以在写入时的性能相对而言可能会受到一些影响,但查询的准确性大幅提升。因此,使用嵌套类型时需要权衡写入性能和查询准确性。

Comments
On this page
Elasticsearch 中的 Nested 类型字段如何使用,有哪些适用场景?