elasticsearch 限制搜索结果中的嵌套数据

c8ib6hqw  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(99)

有一个索引,存储任务要做,在它有一个用户ID,任务ID和里面有嵌套的数据,用于存储一个计时器,用户开始和完成工作的任务。
我在Elasticsearch 6中使用了一个脚本,它搜索特定时间段内的任务和计时器,该脚本只返回与该时间匹配的计时器。
然而,我最近迁移到了Elasticsearch 8,脚本不像以前那样工作了,现在它返回了所有在该时间段内有计时器的任务,但我并没有将其限制为该时间段内的计时器。
任务会正确返回,但其中的所有计时器也会正确返回。
如何让脚本只返回与过滤器匹配的计时器?
脚本:

{
    "size": 1024,
    "track_total_hits": true,
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "user_id": 123
                    }
                },
                {
                    "nested": {
                        "path": "timer.content",
                        "query": {
                            "bool": {
                                "must": {
                                    "range": {
                                        "timer.content.start_work": {
                                            "gte": "2023-08-26T00:00:00-0300",
                                            "lte": "2023-09-26T23:59:59-0300"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                {
                    "terms": {
                        "user_status": [
                            "E",
                            "I"
                        ]
                    }
                }
            ]
        }
    },
    "sort": {
        "task_id": {
            "order": "desc"
        }
    },
    "_source": []
}

索引结构:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "ignoreaccents": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "task_id": {
                "type": "long"
            },
            "user_id": {
                "type": "long",
                "index": true
            },
            "user_status": {
                "type": "keyword",
                "index": true
            },
            "timer": {
                "type": "object",
                "properties": {
                    "content": {
                        "type": "nested",
                        "properties": {
                            "timer_id": {
                                "type": "long",
                                "index": true
                            },
                            "task_id": {
                                "type": "long",
                                "index": true
                            },
                            "user_id": {
                                "type": "long",
                                "index": true
                            },
                            "start_work": {
                                "type": "date",
                                "index": true,
                                "format": "strict_date_time_no_millis"
                            },
                            "end_work": {
                                "type": "date",
                                "index": true,
                                "format": "strict_date_time_no_millis"
                            }
                        }
                    }
                }
            }
        }
    }
}
bksxznpy

bksxznpy1#

您需要将inner_hits添加到嵌套查询中,您还可以选择在_source参数选项中使用excludes排除time.content。下面是一个例子:

DELETE test
PUT test
{
    "settings": {
        "analysis": {
            "analyzer": {
                "ignoreaccents": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "task_id": {
                "type": "long"
            },
            "user_id": {
                "type": "long",
                "index": true
            },
            "user_status": {
                "type": "keyword",
                "index": true
            },
            "timer": {
                "type": "object",
                "properties": {
                    "content": {
                        "type": "nested",
                        "properties": {
                            "timer_id": {
                                "type": "long",
                                "index": true
                            },
                            "task_id": {
                                "type": "long",
                                "index": true
                            },
                            "user_id": {
                                "type": "long",
                                "index": true
                            },
                            "start_work": {
                                "type": "date",
                                "index": true,
                                "format": "strict_date_time_no_millis"
                            },
                            "end_work": {
                                "type": "date",
                                "index": true,
                                "format": "strict_date_time_no_millis"
                            }
                        }
                    }
                }
            }
        }
    }
}

PUT test/_bulk?refresh
{"index": {}}
{"user_id": 123, "user_status": "E", "timer": {"content": [{"timer_id": 1, "start_work": "2023-06-01T00:00:00-0300"}, {"timer_id": 2, "start_work": "2023-09-01T00:00:00-0300"} ]}}

GET test/_search
{
  "size": 1024,
  "track_total_hits": true,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "user_id": 123
          }
        },
        {
          "nested": {
            "path": "timer.content",
            "query": {
              "bool": {
                "must": {
                  "range": {
                    "timer.content.start_work": {
                      "gte": "2023-08-26T00:00:00-0300",
                      "lte": "2023-09-26T23:59:59-0300"
                    }
                  }
                }
              }
            },
            "inner_hits": {}
          }
        },
        {
          "terms": {
            "user_status": [
              "E",
              "I"
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "task_id": {
      "order": "desc"
    }
  },
  "_source": {
    "excludes": "timer.content"
  }
}

相关问题