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

一些东西:

  1. 您的脚本只是遍历一个集合并检查条件,不返回布尔值,这就是您想要的
  2. 你可能会考虑更改为映射number到一个integer类型
  3. 不太确定为什么要有一个字段array,里面有一个嵌套的字段key。您不能只是一个array将是…和数组的字段吗?;-)
  4. 请记住,在ES中,默认情况下,每个字段可以是单个值或数组。
  5. 正如@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

回到顶部