我有一个包含数千个这样的文档的弹性索引。
{
Name: John Doe,
FirstJobStartDate: 8/9/2016,
FirstJobEndDate:1/4/2019,
SecondJobStartDate:7/4/2019,
SecondJobEndDate:8/8/2020,
ThirdJobStartDate: 1/9/2020,
}除了Name & FirstJobStartDate之外,其他任何字段都是可选的,可能会出现在文档中,也可能不会出现。
我需要得到4个数字:
1)有多少单据有FirstJobEndDate?这很简单
{
"size":1,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"exists": {
"field": "FirstJobEndDate"
}
}
]
}
}
}
}
}现在它变得复杂了:
2)有多少文档的FirstJobEndDate小于当前日期,并且没有(SecondJobStartDate、SecondJobEndDate或ThirdJobStartDate)中的一个?
3)有多少文档有FirstJobEndDate,也有(SecondJobStartDate,SecondJobEndDate,ThirdJobStartDate)中的任何一个,并且这些日期中的任何一个都在FirstJobEndDate的1年内?
4)有多少文档有FirstJobEndDate,也有(SecondJobStartDate,SecondJobEndDate,ThirdJobStartDate)中的任何一个,并且这些日期都不在FirstJobEndDate的1年内?
我相信这可以通过“必须”和“应该”的正确组合来完成,但由于同一文档中的两个日期之间的比较,无法得到任何明确的解决方案。
为了确认一下,所有的日期都是有效的弹性日期类型字段,而不是字符串。
任何帮助都将不胜感激。弹性版本: 2.4
发布于 2018-02-23 23:43:17
试试这些:
对于第二个查询:
{
"size": 1,
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "FirstJobEndDate"
}
}
],
"must_not": [
{
"exists": {
"field": "SecondJobStartDate"
}
},
{
"exists": {
"field": "SecondJobEndDate"
}
},
{
"exists": {
"field": "ThirdJobStartDate"
}
}
]
}
}
}对于第三个查询:
{
"size": 1,
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "FirstJobEndDate"
}
}
],
"minimum_should_match": 1,
"should": [
{
"script": {
"script": "doc.SecondJobStartDate.date != null && doc.SecondJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
},
{
"script": {
"script": "doc.SecondJobEndDate.date != null && doc.SecondJobEndDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
},
{
"script": {
"script": "doc.ThirdJobStartDate.date != null && doc.ThirdJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
}
]
}
}
}对于第四个查询:
{
"size": 1,
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "FirstJobEndDate"
}
}
],
"must_not": [
{
"script": {
"script": "doc.SecondJobStartDate.date != null && doc.SecondJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
},
{
"script": {
"script": "doc.SecondJobEndDate.date != null && doc.SecondJobEndDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
},
{
"script": {
"script": "doc.ThirdJobStartDate.date != null && doc.ThirdJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
}
}
]
}
}
}提示:正如您所看到的,您需要利用脚本,这可能会影响性能。因为您事先知道要比较哪些日期,所以应该将日期差异存储在其他标量字段中,以便以后可以轻松地与range查询进行比较。
https://stackoverflow.com/questions/48951313
复制相似问题