Elasticsearch - 即将到来的生日

时间:2015-07-23 19:46:50

标签: date elasticsearch

我是弹性搜索的新手,我一直坚持查询。

我希望在我的用户中获得下一个(现在是+ 3d)生日。它看起来很简单,但并不是因为我只有我的用户的生日。

如果我只有生日(例如:1984-04-15或2015-04-15),我如何直接在查询中直接比较数月和日?

我的字段映射:

"birthdate": {
    "format": "dateOptionalTime",
    "type": "date"
}

我的实际查询根本不起作用:

{
   "query": {
      "range": {
         "birthdate": {
            "format": "dd-MM",
            "gte": "now",
            "lte": "now+3d"
         }
      }
   }
}

我看过这篇文章Elasticsearch filtering by part of date,但我不是解决方案的忠实粉丝,我宁愿选择wilcard而不是“现在+ 3d”

也许我可以用脚本做点什么?

1 个答案:

答案 0 :(得分:0)

在1.5.0版本的elasticsearch中添加了“格式”字段。如果你的 版本低于1.5.0格式将无法正常工作。我们遇到了同样的问题,我们必须在用户的生日发送电子邮件,我们使用的是版本1.4.4。所以我们创建了一个单独的dob字段,我们以“dd-MM”格式存储日期。

我们更改了日期字段的映射:

try {
    $dbh = new PDO("mysql:host=localhost;dbname=searchfood", $user, $password);

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
    // prepare your query
    $query = 'UPDATE users SET longitude=?, latitude=? WHERE id =?';

    $stmt = $dbh->prepare($query);      
    // bind variables
    $stmt->execute(array($_COOKIE['longitude'], $_COOKIE['latitude'], $userid));
    // pull last insert id
    $new = $dbh->lastInsertId(); 




}

然后你可以搜索:

PUT /user
{
  "mappings": {
   "user": {
     "properties": {
      "dob": {
       "type": "date",
       "format": "dd-MM"
       }
     }
   }
  }
}