我是弹性搜索的新手,我一直坚持查询。
我希望在我的用户中获得下一个(现在是+ 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”
也许我可以用脚本做点什么?
答案 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"
}
}
}
}
}