如果我在以下格式的索引中有两个文档,我只想清除那些包含空JSON而不是我期望的键的文档。
一种
{
"search": {
"gold": [1,2,3,4]
}
乙
{
"search":{}
}
我应该只得到A json,而不是B json。
我试过存在查询来搜索“gold”,但它只是检查非null值并返回列表。
注意:以下内容无法满足我的要求。
GET test/_search
{
"query": {
"bool": {
"must": [
{
"exists": { "field": "search.gold" }}
]
}
}
}
这是一个简单的问题,但是即使在他们的文档中搜索后,我也找不到解决方法。
如果有人可以帮助我做到这一点,那就太好了。
索引的简化映射为:
"test": {
"mappings": {
"carts": {
"dynamic": "true",
"_all": {
"enabled": false
},
"properties": {
"line_items": {
"properties": {
"line_items_dyn_arr": {
"type": "nested",
"properties": {
"dynamic_key": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
最佳答案
您是否将完整的json存储在搜索字段中?
如果不是这种情况,请共享索引和样本数据的映射。
更新:查询嵌套字段:
{
"query": {
"nested": {
"path": "search",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "search.gold"
}
}
]
}
}
}
}
}
对于嵌套类型字段,我们需要指定在嵌套字段上执行的路径和查询,因为嵌套字段被索引为子文档。
flex 文档:Nested Query
根据问题中添加的映射进行更新:
{
"query": {
"nested": {
"path": "line_items.line_items_dyn_arr",
"query": {
"exists": {
"field": "line_items.line_items_dyn_arr"
}
}
}
}
}
注意,我们使用了
"path": "line_items.line_items_dyn_arr"
。我们需要提供完整路径的原因是因为nested
字段line_items_dyn_arr
本身在line_items对象下。如果line_items_dyn_arr
是mapping的属性,而不是object
或nested
字段的属性,则上一个查询可以正常工作。
关于json - 如何使用DSL在Elasticsearch中检查JSON对象是否具有 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53447270/