gpt4 book ai didi

Elasticsearch - 阵列上的脚本过滤器

转载 作者:行者123 更新时间:2023-11-29 02:53:51 25 4
gpt4 key购买 nike

我是 ES 的新手,我想使用脚本过滤器来获取数组至少有一个元素小于最大值且大于最小值的所有匹配项(最大值和最小值是脚本中的参数)。

文档如:

 {
"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. 您的脚本只是遍历集合并检查条件,不返回 bool 值,这就是您想要的
  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 - 阵列上的脚本过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com