elasticsearch 弹性单据日期比较问题
我有一个包含数千个这样的文档的弹性索引
elasticsearch 弹性单据日期比较问题,
elasticsearch,
elasticsearch-2.0,
elasticsearch,
elasticsearch 2.0,我有一个包含数千个这样的文档的弹性索引 { 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外,任何其他字段都是可选的,并且可能存在于文
{
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
对于第二个查询:
{
"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"
}
}
]
}
}
}
{
“大小”:1,
“查询”:{
“布尔”:{
“过滤器”:[
{
“存在”:{
“字段”:“FirstJobEndDate”
}
}
],
“最小应匹配”:1,
“应该”:[
{
“脚本”:{
“脚本”:“doc.SecondJobStartDate.date!=null&&doc.SecondJobStartDate.date.getMillis()-doc.FirstJobEndDate.date.getMillis()谢谢Val。这很有帮助。我尝试了这些查询,它们都能正常工作。唯一的问题是,即使字段不存在,脚本也会返回true。例如,我没有ThirdJobStartDate,那么“应该”条件会返回true,因为NA-X<1年。重复,请参见上面的注释。我添加了一个空检查,如果有n,请重试除此之外,您可以结束此问题,谢谢。
{
"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"
}
}
]
}
}
}