我在ElasticSearch中具有以下结构的文档:
"_source": { "last_updated": "2017-10-25T18:33:51.434706", "country": "Italia", "price": [ "€ 139", "€ 125", "€ 120", "€ 108" ], "max_occupancy": [ 2, 2, 1, 1 ], "type": [ "Type 1", "Type 1 - (Tag)", "Type 2", "Type 2 (Tag)", ], "availability": [ 10, 10, 10, 10 ], "size": [ "26 m²", "35 m²", "47 m²", "31 m²" ] } }
基本上,详细信息记录分为5个数组,同一记录的字段在5个数组中具有相同的索引位置。在示例数据中可以看到,有5个数组(价格,最大占用率,类型,可用性,大小),其中包含与同一元素相关的值。我要提取具有max_occupancy字段大于或等于2的元素(如果没有2的记录,则抢3;如果没有3的记录,则抢4,…),价格较低,在这种情况下为记录并将结果放入新的JSON对象中,如下所示:
{ "last_updated": "2017-10-25T18:33:51.434706", "country": "Italia", "price: ": "€ 125", "max_occupancy": "2", "type": "Type 1 - (Tag)", "availability": 10, "size": "35 m²" }
基本上,结果结构应显示提取的记录(在这种情况下为所有数组的第二个索引),并向其中添加常规信息(字段:“ last_updated”,“国家/地区”)。
是否可以从elasticsearch中提取这样的结果?我需要执行哪种查询?
有人可以建议最好的方法吗?
我最好的方法: 嵌套 嵌套数据类型
除了更容易查询之外,它更易于阅读和理解当前分散在不同数组中的那些对象之间的连接。
是的,如果您决定采用这种方法,则必须编辑映射并为整个数据重新编制索引。
映射将如何显示?像这样的东西:
{ "mappings": { "properties": { "last_updated": { "type": "date" }, "country": { "type": "string" }, "records": { "type": "nested", "properties": { "price": { "type": "string" }, "max_occupancy": { "type": "long" }, "type": { "type": "string" }, "availability": { "type": "long" }, "size": { "type": "string" } } } } } }
编辑:新文档结构(包含嵌套文档)-
{ "last_updated": "2017-10-25T18:33:51.434706", "country": "Italia", "records": [ { "price": "€ 139", "max_occupancy": 2, "type": "Type 1", "availability": 10, "size": "26 m²" }, { "price": "€ 125", "max_occupancy": 2, "type": "Type 1 - (Tag)", "availability": 10, "size": "35 m²" }, { "price": "€ 120", "max_occupancy": 1, "type": "Type 2", "availability": 10, "size": "47 m²" }, { "price": "€ 108", "max_occupancy": 1, "type": "Type 2 (Tag)", "availability": 10, "size": "31 m²" } ] }
现在,使用嵌套查询和内部匹配可以更轻松地查询任何特定条件。例如:
{ "_source": [ "last_updated", "country" ], "query": { "bool": { "must": [ { "term": { "country": "Italia" } }, { "nested": { "path": "records", "query": { "bool": { "must": [ { "range": { "records.max_occupancy": { "gte": 2 } } } ] } }, "inner_hits": { "sort": { "records.price": "asc" }, "size": 1 } } } ] } } }
条件是:ItaliaAND max_occupancy > 2。
Italia
max_occupancy > 2
内部点击: 按价格升序排序并获得第一个结果 。
希望你会发现它有用