如何在 Elasticsearch 7.5 中过滤嵌套对象?
How to filter nested object in Elasticsearch 7.5?
我有一个映射:
"ntol-2020-05" : {
"mappings" : {
{
"properties": {
"_createdAt": {
"type": "date"
},
"_logType": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"device": {
"properties": {
...
}
},
"resp": {
"type": "nested",
"properties": {
"data": {
"type": "nested",
"properties": {
...
}
}
}
}
}
}
}
}
}
我用三个条件过滤:
- “_logType”是 "crawler"。
- “2020-05-23”上的“_createdAt”。
- "resp" 的大小 = 0。
我正在尝试使用查询进行过滤:
{"query":{"bool":{"must":[{"term":{"_logType":{"value":"crawler"}}},{"range":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zone":"+07:00"}}},{"nested":{"path":"resp","query":{"script":{"script":{"source":"doc['resp'].size() > 0"}}}}}]}},"from":0,"size":10}
它return错误:
"type": "script_exception",
"reason": "runtime error",
"script_stack": [
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:94)",
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:41)",
"doc['resp'].size() > 0",
" ^---- HERE"
],
"script": "doc['resp'].size() > 0",
"lang": "painless",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "No field found for [resp] in mapping with types []"
}
}
如果我使用脚本 "doc.containsKey('resp') && doc['resp'].size() > 0"
那么它将 return 命中 length = 0.
Help me. Thanks!
您可以对 return 文档使用 exists,其中 "nested" 字段 "resp" 具有值。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "resp",
"query": {
"bool": {
"filter": {
"exists": {
"field": "resp"
}
}
}
}
}
}
]
}
},
"from": 0,
"size": 10
}
我有一个映射:
"ntol-2020-05" : {
"mappings" : {
{
"properties": {
"_createdAt": {
"type": "date"
},
"_logType": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"device": {
"properties": {
...
}
},
"resp": {
"type": "nested",
"properties": {
"data": {
"type": "nested",
"properties": {
...
}
}
}
}
}
}
}
}
}
我用三个条件过滤:
- “_logType”是 "crawler"。
- “2020-05-23”上的“_createdAt”。
- "resp" 的大小 = 0。
我正在尝试使用查询进行过滤:
{"query":{"bool":{"must":[{"term":{"_logType":{"value":"crawler"}}},{"range":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zone":"+07:00"}}},{"nested":{"path":"resp","query":{"script":{"script":{"source":"doc['resp'].size() > 0"}}}}}]}},"from":0,"size":10}
它return错误:
"type": "script_exception",
"reason": "runtime error",
"script_stack": [
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:94)",
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:41)",
"doc['resp'].size() > 0",
" ^---- HERE"
],
"script": "doc['resp'].size() > 0",
"lang": "painless",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "No field found for [resp] in mapping with types []"
}
}
如果我使用脚本 "doc.containsKey('resp') && doc['resp'].size() > 0"
那么它将 return 命中 length = 0.
Help me. Thanks!
您可以对 return 文档使用 exists,其中 "nested" 字段 "resp" 具有值。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "resp",
"query": {
"bool": {
"filter": {
"exists": {
"field": "resp"
}
}
}
}
}
}
]
}
},
"from": 0,
"size": 10
}