如何在具有ES搜索的数组项的嵌套对象上构造基于JSON的查询?

时间:2017-11-21 16:57:27

标签: 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'OR'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"
                            }
                        }
                    }
                }
            }
        }
    }
}

请帮助构建查询,以便我可以搜索

  1. 仅限nodeId,仅限频道,日期范围
  2. 任何标签
  3. 我可以使用

    搜索nodeId,频道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。

1 个答案:

答案 0 :(得分:1)

由于tags是嵌套字段,因此在索引文档之前应定义nested映射。

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

现在您可以索引数据,然后您可以使用嵌套查询语法,对于您的第一个用例,它就像:

{
  "query": {
    "nested": {
      "path": "tags",
      "query": {
        "bool": {
          "must": [
            { "match": { "tags.typeATags": "a1" }},           
            { "match": { "tags.typeBTags": "b1" }}          
          ]
        }
      }
    }
  }
}

下一个查询可以由必须和应该组成,就像最后一个查询一样:

{
  "query": {
    "nested": {
      "path": "tags",
      "query": {
        "bool": {
          "must": [
                { "match": { "tags.typeATags": "a1" }}
          ],
          "should": [
                {"match": {"tags.typeCTags": "c1"}},
                {"match": {"tags.typeCTags": "c3"}}
            ]
        }
      }
    }
  }
}