[英]Elasticsearch - Script filter on array
我是ES中的新bie,我想使用腳本過濾器來獲得所有匹配,即數組至少有一個小於max且大於min的元素(max和min是腳本中的param)。
該文件如:
{
"number": "5",
"array": {
"key": [
10,
5,
9,
20
]
}
}
我嘗試了腳本,但它不起作用
{
"script": {
"lang": "groovy",
"params": {
"max": 64,
"min": 6
},
"script": "for(element in doc['array.key'].values){element>= min + doc['number'].value && element <=max + doc['number'].value}"
}
}
沒有錯誤消息,但搜索結果是錯誤的。有沒有辦法迭代數組字段?
謝謝你們。
是的,這是可行的,但是你的腳本並沒有這樣做。 嘗試使用Groovy的any()方法代替:
doc['array.key'].values.any{ it -> it >= min + doc['number'] && it <= max + doc['number'] }
一些東西:
number
為integer
類型 array
,里面有一個嵌套的字段key
。 難道你不能只有一個字段array
......和數組嗎? ;-) conf/elasticsearch.yml
elasticsearch.yml中啟用動態腳本,但我猜你已經完成了,否則你會得到異常。 像這樣的非常簡單的映射應該有效:
{
"mappings": {
"document": {
"properties": {
"value": {
"type": "integer"
},
"key": {
"type": "integer"
}
}
}
}
}
例:
POST /documents/document/1
{
"number": 5,
"key": [
10,
5,
9,
20
]
}
POST /documents/document/2
{
"number": 5,
"key": [
70,
72
]
}
查詢:
GET /documents/document/_search
{
"query": {
"bool": {
"filter": {
"script": {
"lang": "groovy",
"params": {
"max": 64,
"min": 6
},
"script": "doc['key'].values.any{ it -> it >= min + doc['number'] && it <= max + doc['number'] }"
}
}
}
}
}
結果:
{
"took": 22,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0,
"hits": [
{
"_index": "documents",
"_type": "document",
"_id": "1",
"_score": 0,
"_source": {
"number": 5,
"key": [
10,
5,
9,
20
]
}
}
]
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.