Elasticsearch-数组上的脚本过滤器
我是ES中的新手,我想使用脚本过滤器来获得所有匹配,即数组至少具有一个小于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
将是…和数组的字段吗?;-) - 请记住,在ES中,默认情况下,每个字段可以是单个值或数组。
- 正如@Val所提到的,您需要在自己的服务器中启用动态脚本,
conf/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
]
}
}
]
}
}
以上是 Elasticsearch-数组上的脚本过滤器 的全部内容, 来源链接: utcz.com/qa/419461.html