\我无法在 Painless 中对子文档执行 LOOP。这只是为运行 LOOP 而创建的一个示例场景,场景是另一种场景(这种情况可能是运行过滤器,但问题是子文档中的循环)。
GET /_stats
GET /product/_mapping
GET /product/_settings
GET /product/table/_search
{"size":99}
创建
DELETE /product
PUT /product
{
"mappings":{
"table":{
"properties":{
"name":{"type":"string","index":"not_analyzed"},
"price":{"type":"float"},
"subproduct":{
"type":"nested",
"properties":{
"category":{"type":"long"},
"subname":{"type":"string","index":"not_analyzed"},
"subprice":{"type":"float"}
}
}
}
}
}
}
数据
PUT /product/table/1
{"name":"Product 1",
"price":123,
"subproduct":[
{"category":1,
"subname":"SubProduct 1.1",
"subprice":1.1},
{"category":2,
"subname":"SubProduct 1.2",
"subprice":1.2},
{"category":3,
"subname":"SubProduct 1.2",
"subprice":1.3}
]
}
PUT /product/table/2
{"name":"Product 2",
"price":234,
"subproduct":[
{"category":1,
"subname":"SubProduct 2.1",
"subprice":2.1},
{"category":2,
"subname":"SubProduct 2.2",
"subprice":2.2},
{"category":3,
"subname":"SubProduct 2.2",
"subprice":2.3}
]
}
PUT /product/table/3
{"name":"Product 1",
"price":345,
"subproduct":[
{"category":1,
"subname":"SubProduct 3.1",
"subprice":3.1},
{"category":2,
"subname":"SubProduct 3.2",
"subprice":3.2},
{"category":3,
"subname":"SubProduct 3.2",
"subprice":3.3}
]
}
查询
GET /product/table/_search
{
"_source":true,
"size":9,
"script_fields":{
"sub":{
"script":{
"lang":"groovy",
"inline":"price=0; for(s in _source.subproduct){if(s.category==2) price=s.subprice;}; return price;"
}
}
}
}
GET /product/table/_search
{
"_source":true,
"size":9,
"script_fields":{
"sub":{
"script":{
"lang":"painless",
"inline":"def price=0; for(s in _source.subproduct){if(s.category==2) price=s.subprice;} return price;"
}
}
}
}
GET /product/table/_search
{
"_source":true,
"size":9,
"script_fields":{
"sub":{
"script":{
"lang":"painless",
"inline":"def price=0; for(s in doc['subproduct']){if(s.category==2) price=s.subprice;} return price;"
}
}
}
}
GET /product/table/_search
{
"_source":true,
"size":9,
"script_fields":{
"sub":{
"script":{
"lang":"painless",
"inline":"def price=0; for (int i=0; i<doc['subproduct'].length; ++i){if(doc['subproduct'][i].category==2) price=doc['subproduct'][i].subprice;} return price;"
}
}
}
}