使用"现在"进行术语过滤在elasticsearch 1.7.1

时间:2015-09-08 08:26:55

标签: elasticsearch

使用术语过滤器时,我无法再使用now elasticsearch 1.7.1了。它在以前的版本中运行良好,但现在它返回:

nested: IllegalArgumentException[Invalid format: \"now/y\"]

查询示例是:

GET _search
{
  "size": 0,
  "aggs": {
    "price": {
      "nested": {
        "path": "prices"
      },
      "aggs": {
        "valid": {
          "filter": {
            "term": {
              "prices.referred_year": "now/y"
            }
          },
          "aggs": {
            "ranged": {
              "range": {
                "field": "prices.price",
                "ranges": [
                  {
                    "to": 10
                  },
                  {
                    "from": 10
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}

架构:

curl -XPUT 'http://localhost:9200/test/' -d '{
  "mappings": {
    "product": {
      "properties": {
        "prices": {
          "type": "nested",
          "include_in_parent": true,
          "properties": {
            "price": {
              "type": "float"
            },
            "referred_year": {
              "type": "date",
              "format": "year"
            }
          }
        }
      }
    }
  }
}'

文件示例:

curl -XPUT 'http://localhost:9200/test/product/1' -d '{
  "prices": [
    {
      "referred_year": "2015",
      "price": "10.00"
    },
    {
      "referred_year": "2016",
      "price": "11.00"
    }
  ]
}'

聚合的预期结果(通过用now/y替换2015获得):

"aggregations": {
  "price": {
    "doc_count": 2,
    "valid": {
      "doc_count": 1,
      "ranged": {
        "buckets": [
          {
            "key": "*-10.0",
            "to": 10,
            "to_as_string": "10.0",
            "doc_count": 0
          },
          {
            "key": "10.0-*",
            "from": 10,
            "from_as_string": "10.0",
            "doc_count": 1
          }
        ]
      }
    }
  }
}

now/y等在Range Filter和查询中仍然可以正常工作。

我很感激任何帮助。谢谢!

-------更新-------

因此,无论四舍五入,似乎now根本无法使用术语过滤器。

1 个答案:

答案 0 :(得分:0)

所以,虽然我还没有发现任何文档说明,但似乎在术语过滤器中不允许使用now运算符。这实际上是有意义的。

正确的查询是:

GET test/_search
{
  "size": 0,
  "aggs": {
    "price": {
      "nested": {
        "path": "prices"
      },
      "aggs": {
        "valid": {
          "filter": {
            "range": {
              "prices.referred_year": {
                "gte": "now/y",
                "lte": "now/y"
              }
            }
          },
          "aggs": {
            "ranged": {
              "range": {
                "field": "prices.price",
                "ranges": [
                  {
                    "to": 10
                  },
                  {
                    "from": 10
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}