Elasticsearch 中的 OR 和 AND 运算符

OR and AND Operators in Elasticsearch

有这个映射:

"title": { "type": "text"},
"description": { "type": "text" },
"created_at": { "type": "date" },
"modified_at": { "type": "date" },
"funnel": {
  "type": "nested",
  "dynamic": "strict",
  "properties": {
    "id":  { "type":   "long"  },
    "stages": {
      "type": "nested",
      "dynamic": "strict",
      "properties": {
        "stage": {"type": "long"},
        "date_in": {"type": "date"},
        "date_out": {"type": "date"}
      }
    }
  }
}

我试图获取一段时间内(从 2018-10-01 到 2018-10-05)至少有一个阶段嵌套文档的所有文档,或者它们仍处于一个阶段(date_out null) 使用以下查询:

"query": {
  "bool": {
    "filter": {
      "bool": {
        "must": [
          {
            "nested": {
              "query": {
                "range": {
                  "funnel.stages.date_in": {
                    "lte": "2018-10-05"
                  }
                }
              },
              "path": "funnel.stages",
              "ignore_unmapped": false,
              "score_mode": "none"
            }
          },
          {
            "bool": {
              "should": [
                {
                  "nested": {
                    "query": {
                      "range": {
                        "funnel.stages.date_out": {
                          "gte": "2018-10-01"
                        }
                      }
                    },
                    "path": "funnel.stages",
                    "ignore_unmapped": false,
                    "score_mode": "none"
                  }
                },
                {
                  "bool": {
                    "must_not": [
                      {
                        "exists": {
                          "field": "funnel.stages.date_out"
                        }
                      }
                    ],
                    "adjust_pure_negative": true
                  }
                }
              ],
              "adjust_pure_negative": true
            }
          }
        ],
        "adjust_pure_negative": true
      }
    }
  }
}

我认为这是在 elasticsearch 上执行此操作的方法,但后来我得到了这个文档作为匹配项:

"_source": {
  "title": "sdfgsdfgsdf",
  "description": "",
  "created_at": "2018-07-17T13:45:39+00:00",
  "modified_at": "2018-07-25T09:58:40+00:00",
  "funnel": {
    "id": "57",
    "stages": [
      {
        "stage": "337",
        "date_in": "2018-07-17T13:45:40+00:00",
        "date_out": "2018-07-25T09:58:36+00:00"
      }
    ]
  }
}

此时我不知道自己在查询中做错了什么 :p

非常感谢任何帮助!

试试这个对我有用的查询:

  {
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "query": {
                    "range": {
                      "funnel.stages.date_in": {
                        "lte": "2018-10-05",
                        "gte": "2018-10-01"
                      }
                    }
                  },
                  "path": "funnel.stages",
                  "ignore_unmapped": false,
                  "score_mode": "none"
                }
              },
              {
                "nested": {
                  "query": {
                    "range": {
                      "funnel.stages.date_out": {
                        "lte": "2018-10-05",
                        "gte": "2018-10-01"
                      }
                    }
                  },
                  "path": "funnel.stages",
                  "ignore_unmapped": false,
                  "score_mode": "none"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "query": {
                    "range": {
                      "funnel.stages.date_in": {
                        "lte": "2018-10-05",
                        "gte": "2018-10-01"
                      }
                    }
                  },
                  "path": "funnel.stages",
                  "ignore_unmapped": false,
                  "score_mode": "none"
                }
              },
              {
                "nested": {
                  "query": {
                    "bool": {
                      "must_not": {
                        "exists": {
                          "field": "funnel.stages.date_out"
                        }
                      }
                    }
                  },
                  "path": "funnel.stages",
                  "ignore_unmapped": false,
                  "score_mode": "none"
                }
              }
            ]
          }
        }
      ],
      "adjust_pure_negative": true
    }
  }
}