database - 如何使用 ES 搜索对具有数组项的嵌套对象构建基于 JSON 的查询?

标签 database elasticsearch

[
    {
        "name": "Document 1",
        "tags": {
            "typeATags": ["a1"],
            "typeBTags": ["b1"],
            "typeCTags": ["c1"],
            "typeDTags": ["d1"]
        }
    },
    {
        "name": "Document 2",
        "tags": {
            "typeATags": ["a2"],
            "typeBTags": ["b1", "b2"],
            "typeCTags": ["c2"],
            "typeDTags": ["d1", "d2"]
        }
    },
    {
        "name": "Document 3",
        "tags": {
            "typeATags": ["a1", "a2", "a3"],
            "typeBTags": ["b1", "b2", "b3"],
            "typeCTags": ["c3"],
            "typeDTags": ["d1", "d2", "d3"]
        }
    }
]

如何在 ES 6.0 上构建查询,
这将返回所有具有“a1”和“b1”标签的记录?//应该返回 1,3

这将返回所有包含“a1”和“a2”标签的记录?//应该返回 3

这将返回所有具有“a1”或“a2”标签的记录?//应该返回1,2,3

这将返回所有具有“a1”和(“c1”或“c3”)标签的记录?//应该返回1,2

感谢@mickl 的回答
编辑1:

这是我的实际架构,
{
    "cmslocal": {
        "mappings": {
            "video": {
                "properties": {
                    "assetProps": {
                        "properties": {
                            "assetType": {
                                "type": "string"
                            },
                            "configPath": {
                                "type": "string",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                },
                                "analyzer": "standard"
                            },
                            "contentSha1": {
                                "type": "string"
                            },
                            "originalPath": {
                                "type": "string",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                },
                                "analyzer": "standard"
                            },
                            "path": {
                                "type": "string",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                },
                                "analyzer": "standard"
                            },
                            "thumbnailPath": {
                                "type": "string",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                },
                                "analyzer": "standard"
                            }
                        }
                    },
                    "channel": {
                        "type": "string"
                    },
                    "configProps": {
                        "properties": {
                            "events": {
                                "type": "nested",
                                "include_in_root": true,
                                "properties": {
                                    "Desc": {
                                        "type": "string"
                                    },
                                    "Tags": {
                                        "type": "string"
                                    },
                                    "UUID": {
                                        "type": "string"
                                    }
                                }
                            },
                            "roiUUID": {
                                "type": "string"
                            }
                        }
                    },
                    "contentSha1": {
                        "type": "string"
                    },
                    "eventDesc": {
                        "type": "string"
                    },
                    "ext": {
                        "type": "string"
                    },
                    "format": {
                        "type": "string"
                    },
                    "fovProps": {
                        "properties": {
                            "description": {
                                "type": "string"
                            },
                            "width": {
                                "type": "float"
                            }
                        }
                    },
                    "locationProps": {
                        "type": "nested",
                        "properties": {
                            "address": {
                                "type": "string"
                            },
                            "city": {
                                "type": "string"
                            },
                            "country": {
                                "type": "string"
                            },
                            "county": {
                                "type": "string"
                            },
                            "location": {
                                "type": "geo_point"
                            },
                            "postcode": {
                                "type": "string"
                            },
                            "state": {
                                "type": "string"
                            }
                        }
                    },
                    "nodeid": {
                        "type": "string"
                    },
                    "poleHeight": {
                        "type": "float"
                    },
                    "query": {
                        "properties": {
                            "bool": {
                                "properties": {
                                    "filter": {
                                        "properties": {
                                            "term": {
                                                "properties": {
                                                    "nodeid": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "retentionPolicy": {
                        "type": "string"
                    },
                    "siteScopeID": {
                        "type": "string"
                    },
                    "tagProps": {
                        "type": "nested",
                        "properties": {
                            "conditions": {
                                "type": "string"
                            },
                            "environment": {
                                "type": "string"
                            },
                            "events": {
                                "type": "string"
                            },
                            "lighting": {
                                "type": "string"
                            },
                            "objects": {
                                "type": "string"
                            },
                            "other": {
                                "type": "string"
                            },
                            "scenes": {
                                "type": "string"
                            },
                            "useCases": {
                                "type": "string"
                            },
                            "weather": {
                                "type": "string"
                            }
                        }
                    },
                    "test": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "uploadTime": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "videoProps": {
                        "properties": {
                            "bitrate": {
                                "type": "float"
                            },
                            "datetime": {
                                "type": "date",
                                "format": "date_hour_minute_second_millis"
                            },
                            "daySegments": {
                                "type": "string"
                            },
                            "duration": {
                                "type": "long"
                            },
                            "framerate": {
                                "type": "float"
                            },
                            "height": {
                                "type": "integer"
                            },
                            "overlaysOn": {
                                "type": "boolean"
                            },
                            "width": {
                                "type": "integer"
                            }
                        }
                    }
                }
            }
        }
    }
}

请帮助构建查询,以便我可以搜索
  • 只有nodeId,只有 channel ,日期范围
  • 任何标签

  • 我可以使用搜索 nodeId、Channel Id
    {
        "query": {
            "bool": {
                "filter": [
                    { "match": { "nodeid": "N02cff15a" } },
                    { "match": { "channel": "1" } }
                ]
            }
        }
    }
    

    我可以使用搜索 tagProps
    {
        "nested": {
            "path": "tagProps",
            "query": {
                "bool": {
                    "must": [
                        { "match": { "tagProps.objects": "car" } },
                        { "match": { "tagProps.objects": "truck" } }
                    ]
                }
            }
        }
    }
    

    帮我组合两个查询,以便我可以使用标签组合搜索 NodeId。

    最佳答案

    由于标签是一个嵌套字段,您应该定义 nested在索引文档之前进行映射。

    {
      "mappings": {
        "your_type": {
          "properties": {
            "tags": {
              "type": "nested" 
            }
          }
        }
      }
    }
    

    现在您可以索引您的数据,然后您可以使用嵌套查询语法,对于您的第一个用例,它就像:
    {
      "query": {
        "nested": {
          "path": "tags",
          "query": {
            "bool": {
              "must": [
                { "match": { "tags.typeATags": "a1" }},           
                { "match": { "tags.typeBTags": "b1" }}          
              ]
            }
          }
        }
      }
    }
    

    下一个查询可以由 must 和 should 组成,就像最后一个查询一样:
    {
      "query": {
        "nested": {
          "path": "tags",
          "query": {
            "bool": {
              "must": [
                    { "match": { "tags.typeATags": "a1" }}
              ],
              "should": [
                    {"match": {"tags.typeCTags": "c1"}},
                    {"match": {"tags.typeCTags": "c3"}}
                ]
            }
          }
        }
      }
    }
    

    关于database - 如何使用 ES 搜索对具有数组项的嵌套对象构建基于 JSON 的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418578/

    相关文章:

    elasticsearch - Elasticsearch何时确定文档的索引?

    elasticsearch - 添加具有与映射中指定值不同类型的值的字段

    r - 将第 1-12 周改为第 1 季度

    php - 在 Elasticsearch php API 中使用多种类型或索引

    arrays - 为动态填充的对象数组生成 Mongoose 模式

    sql - 数据库设计 : how to avoid serialization when data structure is not static

    ubuntu - 无法从主机操作系统访问 Vagrant VM 中的 Elasticsearch 2.0

    elasticsearch - AWS Elasticsearch:如何更新现有索引的分析器设置

    php - 使用未定义的常量 OCI_COMMIT_ON_SUCCESS - 创建 Oracle 数据库连接时假定为 'OCI_COMMIT_ON_SUCCESS'

    mysql - 如何使用交叉连接将 100 万条记录插入表数据库 Oracle