如何编写Elasticsearch查询获取指定日期区间的深层嵌套字段数据?
如何查询Elasticsearch中发布日期在指定区间的嵌套字段记录?
需求:查询索引my-books-index-1中,所有发布日期在5月25日至5月31日之间的记录。
索引映射
GET my-books-index-1/_mapping { "my-books-index-1": { "mappings": { "properties": { "book": { "properties": { "bookInfo": { "properties": { "publisherInfo": { "type": "nested", "properties": { "publication": { "properties": { "publishedOn": { "type": "date" } } } } } } } } } } } } }
样本记录
"_source": { "book": { "name": "Harry Potter", "bookInfo": { "author": "J.K. Rowling", "publisherInfo": [ { "price": "100", "publication": { "publishedOn": 1685268404000 // [Sunday, May 28, 2023 10:06:44 AM] } } ] } } }
解决方案
由于publisherInfo是nested类型,必须使用nested查询来正确检索嵌套字段中的数据。以下是符合需求的查询语句:
GET my-books-index-1/_search { "query": { "nested": { "path": "book.bookInfo.publisherInfo", "query": { "range": { "book.bookInfo.publisherInfo.publication.publishedOn": { "gte": "2023-05-25", "lt": "2023-06-01", "format": "yyyy-MM-dd" } } }, "inner_hits": {} // 可选,返回匹配的嵌套文档详情 } } }
关键说明
nested查询的path参数指定嵌套字段的完整路径:book.bookInfo.publisherInforange查询中,使用gte(大于等于)和lt(小于)来覆盖5月25日00:00到5月31日23:59的所有时间点(用2023-06-01作为上限,避免遗漏5月31日的晚时段数据)format参数指定日期格式,Elasticsearch也可自动识别符合ISO标准的日期字符串- 若需要在返回结果中看到具体匹配的嵌套项,添加
inner_hits字段即可
内容的提问来源于stack exchange,提问作者Sambit
相关产品推荐
相关产品推荐

