jav*_*nna 54
我会看一下脚本过滤器.以下过滤器应仅返回fieldname
字段中至少包含10个元素的文档,即阵列.请记住,这可能很昂贵,具体取决于索引中包含的文档数量.
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
Run Code Online (Sandbox Code Playgroud)
关于第二个问题:那你真的有一个空阵列吗?或者它只是一个没有值的数组字段?您可以使用缺少的过滤器来获取对于特定字段没有任何价值的文档:
"filter" : {
"missing" : { "field" : "user" }
}
Run Code Online (Sandbox Code Playgroud)
否则我猜你需要再次使用脚本,类似于我上面提到的,只是输入不同的长度.如果长度是常量,我会把它放在params
部分中,这样脚本将被elasticsearch缓存并重用,因为它总是相同的:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > param1"
"params" : {
"param1" : 10
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 14
javanna的答案在Elasticsearch 1.3.x及更早版本中是正确的,因为1.4默认脚本模块已更改为groovy(mvel).
回答OP的问题.
在Elasticsearch 1.3.x及更早版本中,使用以下代码:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
Run Code Online (Sandbox Code Playgroud)
在Elasticsearch 1.4.x及更高版本中,使用以下代码:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
Run Code Online (Sandbox Code Playgroud)
此外,在Elasticsearch 1.4.3及更高版本中,由于安全性问题,您需要启用动态脚本,因为它已默认禁用.请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-scripting.html
Imho使用脚本按大小过滤数组的正确方法是:
"filter" : {
"script" : {
"script" : "_source.fieldName.size() > 1"
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,因为@javanna建议抛出异常 groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String
如果您有一组未映射为 的对象nested
,请记住 Elastic 会将它们展平为:
attachments: [{size: 123}, {size: 456}] --> attachments.size: [123, 456]
Run Code Online (Sandbox Code Playgroud)
所以你想将你的字段引用为doc['attachments.size'].length
,而不是doc['attachments'].length
,这是非常违反直觉的。
对于 也一样doc.containsKey(attachments.size)
。
该.values
部件已弃用,不再需要。
还在这里贴出了与我相同情况的人.假设您的数据如下所示:
{
"_source": {
"fieldName" : [
{
"f1": "value 11",
"f2": "value 21"
},
{
"f1": "value 12",
"f2": "value 22"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
然后过滤fieldName
长度> 1,例如:
"query": {
"bool" : {
"must" : {
"script" : {
"script" : {
"inline": "doc['fieldName.f1'].values.length > 1",
"lang": "painless"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
脚本语法为ES 5.4文档https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html.
归档时间: |
|
查看次数: |
48063 次 |
最近记录: |