下面是示例映射、文档结构、您要查找的查询以及响应
映射:
PUT mycars
{
"mappings":{
"properties":{
"cars":{
"type":"nested",
"properties":{
"purchase_date":{
"type":"date"
},
"type":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"owner":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
如果您注意到映射,嵌套字段将是 cars,其中 purchase_date 作为日期字段,而 type 作为文本字段,同时提供文本和关键字类型。
我还添加了一个字段owner,只是为了理解和赋予文档一种身份。
示例文件:
POST mycars/_doc/1
{
"owner": "john",
"cars":[
{
"type": "Ford",
"purchase_date": "2017-01-01"
},
{
"type": "Tesla",
"purchase_date": "2019-01-01"
}
]
}
POST mycars/_doc/2
{
"owner": "jess",
"cars":[
{
"type": "Ford",
"purchase_date": "2017-01-01"
}
]
}
POST mycars/_doc/3
{
"owner": "jenny",
"cars":[
{
"type": "Ford",
"purchase_date": "2019-01-01"
}
]
}
POST mycars/_doc/4
{
"owner": "tom",
"cars":[
{
"type": "Ford",
"purchase_date": "2016-01-01"
}
]
}
现在您的查询是给我所有购买日期小于或等于“特定时间点”并且他们的型号是“福特”的人
我有前两个和最后一个文档属于您的查询,日期为2017-01-01
所以下面的查询是我所拥有的给了我所有在2018-01-01 或之前购买Ford 并且在2018-01-01 之后没有购买其他汽车的人
查询:
POST mycars/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "cars",
"query": {
"bool": {
"must": [
{
"match": {
"cars.type.keyword": "Ford"
}
},
{
"range": {
"cars.purchase_date": {
"lte": "2018-01-01"
}
}
}
]
}
}
}
}
],
"must_not": [
{
"nested": {
"path": "cars",
"query": {
"bool": {
"must": [
{
"range": {
"cars.purchase_date": {
"gte": "2018-01-01"
}
}
}
]
}
}
}
}
]
}
}
}
我添加了must_not 子句,以便过滤用户在must 子句中提到的日期之后最终购买任何其他汽车的文档。
请注意,我只是使用了Bool 查询和Range 查询嵌套文档。
希望这会有所帮助!