【问题标题】:Elasticsearch or term combined with date rangeElasticsearch 或术语与日期范围相结合
【发布时间】:2016-10-10 08:41:13
【问题描述】:

我正在尝试使用包含范围的 OR 语句查询我的索引,为此我构建了以下查询(在文档的帮助下):

{
    "query": {
        "match_all": {}
    },
    "size": 50,
    "filter": {
        "or": [{
            "term": {
                "fromPlace": "liverpool"
            },
            "range" : {
                "query" : {
                    "gte": "01/01/2012",
                    "lte": "2013",
                    "format": "dd/MM/yyyy||yyyy"
                }
            }
        }]
    }
}

然而,这给了我一个“查询格式错误,start_object 后没有字段”错误。完整的错误信息:

{
  "error": {
    "root_cause": [
      {
        "type": "query_parsing_exception",
        "reason": "[_na] query malformed, no field after start_object",
        "index": "quote-lanes2",
        "line": 13,
        "col": 15
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "quote-lanes2",
        "node": "opqibf4zRxOXTHz0QIAaeA",
        "reason": {
          "type": "query_parsing_exception",
          "reason": "[_na] query malformed, no field after start_object",
          "index": "quote-lanes2",
          "line": 13,
          "col": 15
        }
      }
    ]
  },
  "status": 400
}

有什么建议吗?还是对文档的详细说明? 提前谢谢各位!

编辑:

感谢@or-weinberger,因此查询已修复,但它实际上并没有过滤日期。我将“query”更改为“validFrom”,这样我的查询看起来像:

{
  "size": 50,
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "or": [
          {
            "term": {
              "fromPlace": "liverpool"
            }
          },
          {
            "range": {
              "validFrom": {
                "gte": "2017-03-22T08:43:11",
                "format": "strict_date_optional_time||epoch_millis"
              }
            }
          }
        ]
      }
    }
  }
}

GTE 显然是在未来,不应该匹配具有以下值的文档(但它确实如此):

我的日期字段正确映射为日期字段:

理想情况下,我只想过滤“yyyy/mm/dddd”部分。 有什么想法吗?

【问题讨论】:

    标签: date elasticsearch range


    【解决方案1】:

    您的查询确实格式错误,过滤器应该在bool 元素下,而该元素应该在query 元素下。此外,当使用or/and 时,您应该为每个过滤器元素(范围/术语等)创建单独的对象,例如:

    {
      "size": 50,
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": {
            "or": [
              {
                "term": {
                  "fromPlace": "liverpool"
                }
              },
              {
                "range": {
                  "query": {
                    "gte": "01/01/2012",
                    "lte": "2013",
                    "format": "dd/MM/yyyy||yyyy"
                  }
                }
              }
            ]
          }
        }
      }
    }
    

    【讨论】:

    • 谢谢,不知道 bool 的事情 :)
    • 因此,如果我希望将范围应用于“validFrom”字段,我将“query”更改为“validFrom”对吗?这会产生 0 个结果,可能是因为我的日期格式不同吧?我得到“2015-07-22T08:43:11”我尝试将格式选项设置为 yyyy-MM-dd h:mm tt 但这不起作用。 tt 显然无效。然后我尝试将其更改为:“yyyy/MM/dd HH:mm:ss”,但这似乎并没有真正应用过滤器。
    • 所以我尝试了: "format": "strict_date_optional_time||epoch_millis" 这似乎有效,但不知何故 "gte": "2017-03-22T08:43:11" 也匹配 "validFrom": " 2015-07-22T08:43:11" .... 嗯
    • 字段validFrom 是否映射为date?请转至/_mapping 端点进行检查。
    • 嗯....提名我获得旅鼠奖.....哈哈,我确实不记得那个或声明.... :) 谢谢老兄!
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2015-12-30
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多