是的,这是可行的,但是您的脚本没有这样做。尝试改用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 ] } } ] }}


