Foreach - Painless


(Thiago Silva) #1

Oi não estou conseguindo executar LOOP em subdocumentos no Painless.
Este é apenas um exemplo um cenário criado para executar LOOP o cenário é outro (este caso poderia ser executado filtro mas o problema é o Loop em subdocumentos).

Hi, I am not able to execute LOOP on subdocuments in Painless.
This is just one example scenario created to run LOOP the scenario is another (this case could be run filter but the problem is the loop in subdocuments).

GET /_stats

GET /product/_mapping
GET /product/_settings

GET /product/table/_search
{"size":99}

CREATEs

DELETE /product

GET /product/table/_search
{"size":99}
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"}
				}
			}
		}
	}
}
}

DATAs

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}
	]
}

QUERYs

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;"
			}
		}
	}
}

(Thiago Souza) #2

Hello Chará :wink:

What is the result/error that you are getting?


(Thiago Souza) #3

Nevermind, I've found the issue.

Because it is a nested type, you can not access through doc and you need to access it using _source. According to script_field docs, you need to use params['_source'].

So here is a modified version that will wok:

GET /product/table/_search
{
	"size":9,
	"script_fields":{
		"sub":{
			"script":{
				"lang":"painless",
				"inline":"def price=0; for (p in params['_source'].subproduct) { if (p.category==2) price=p.subprice; } return price;"
			}
		}
	}
}

I hope this helps!


(Thiago Silva) #4

Brother, funcionou, muito obrigado por tudo.
A próxima vez que tu vir ao sul, vamos tomar uma cerveja no FreeRiders, onde foi o Meetup de Elastic em Porto Alegre, fica a 200 metros da nossa empresa.

Brother, it worked, thank you so much for everything.
The next time you come south, let's have a beer at FreeRiders, where it was the Elastic Meetup in Porto Alegre, it's 200 meters from our company.


(Thiago Souza) #5

Sure! I am glad I could help! I accept the beer invitation :slight_smile:

Also, keep in mind that the recommended way to use script is using script in a file or stored instead of inline scripts. See https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html for more information!

Cheers


(system) #6

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.