如果 JSON 对象具有使用 DSL 的密钥,如何在 elasticsearch 中进行检查?
How to check in elasticsearch if a JSON object has a key using the DSL?
如果我在以下格式的索引中有两个文档,我只想清除那些具有空 JSON 而不是我预期的键的文档。
一个
{
"search": {
"gold": [1,2,3,4]
}
B
{
"search":{}
}
我应该只得到 A json 而不是 B json。
我已经尝试使用 exists 查询来搜索 "gold",但它只检查非空值和 returns 列表。
注意:以下不符合我的要求。
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"
}
}
}
}
}
}
}
}
}
您是否在 search 字段中存储了完整的 json?
如果不是这种情况,请分享您的索引和示例数据的映射。
更新: 查询嵌套字段:
{
"query": {
"nested": {
"path": "search",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "search.gold"
}
}
]
}
}
}
}
}
对于嵌套类型字段,我们需要指定 path 和 query 在嵌套字段上执行,因为嵌套字段被索引为子文档。
弹性文档: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
是映射的 属性,而不是 object
或 nested
字段的 属性,则先前的查询将正常工作。
Nishant 的回答是正确的,但出于某种原因,只有当路径和字段是整个路径时我才能让它工作。
以下适合我。
{
"nested": {
"path": "search.gold",
"query": {
"exists": {
"field": "search.gold"
}
}
}
}
如果我在以下格式的索引中有两个文档,我只想清除那些具有空 JSON 而不是我预期的键的文档。
一个
{
"search": {
"gold": [1,2,3,4]
}
B
{
"search":{}
}
我应该只得到 A json 而不是 B json。
我已经尝试使用 exists 查询来搜索 "gold",但它只检查非空值和 returns 列表。 注意:以下不符合我的要求。
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"
}
}
}
}
}
}
}
}
}
您是否在 search 字段中存储了完整的 json? 如果不是这种情况,请分享您的索引和示例数据的映射。
更新: 查询嵌套字段:
{
"query": {
"nested": {
"path": "search",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "search.gold"
}
}
]
}
}
}
}
}
对于嵌套类型字段,我们需要指定 path 和 query 在嵌套字段上执行,因为嵌套字段被索引为子文档。
弹性文档: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
是映射的 属性,而不是 object
或 nested
字段的 属性,则先前的查询将正常工作。
Nishant 的回答是正确的,但出于某种原因,只有当路径和字段是整个路径时我才能让它工作。
以下适合我。
{
"nested": {
"path": "search.gold",
"query": {
"exists": {
"field": "search.gold"
}
}
}
}