date - 如何在 Elastic Search 中对日期属性进行全文查询
问题描述
我有一个带有日期类型属性的文档(如下所示)
{
"releaseDate": {
"time": "1990-02-01T00:00:00+0000",
}
}
我有信心做一些范围查询(日期数学等),所以如果我正在寻找 1990 年的所有事件,我可以做以下范围查询
{
"query": {
"range": {
"releaseDate.time": {
"gte": "1990",
"lte": "1991"
}
}
}
}
我注意到弹性搜索允许在日期上进行全文搜索(匹配)
匹配查询接受文本/数字/日期,分析它们,并构造一个查询。例如: https ://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html
但我无法理解如何进行正确的查询。
例如,如果我搜索以下匹配查询
{
"query": {
"match": {
"attribute.releaseDate.time": "1990"
}
}
}
即使日期1990-02-01T00:00:00
存在,ES 也会返回零个结果
但如果我做以下
{
"query": {
"match": {
"attribute.releaseDate.time": "1990-02"
}
}
}
我找到了我的活动。
我的理解是,通过搜索查询,ES 将扩展我的搜索,因为这与第二个查询中的标记相同时1990-01-01T00:00:00+0000
的索引值不匹配。1990-02-01T00:00:00+0000
这将导致我的问题:
有什么方法可以使用以下查询?- 事件发生在 1990 年,日期包含 1990 年(没有范围) - 事件发生在任何一年的 2 月 - 事件发生在 2 月的任何一年的 5 日
但我还没有找到任何可行的例子(我发现的唯一的事情是在这里https://discuss.elastic.co/t/mapping-date-field-as-multifiled-to-provide-date-query-and -全文搜索/80691)
解决方案
不幸的是,你不能这样做。如果要按年份搜索,则必须使用范围查询和舍入
例如,在您的情况下,您可以使用下一个查询:
{
"query": {
"range" : {
"age" : {
"gte" : "1990||/y",
"lte" : "1990||/y"
}
}
}
}
推荐阅读
- javascript - Blogger 站点地图 JavaScript
- php - 使用PHP搜索mysql数据库
- amazon-s3 - 发布到公共 S3 存储桶下的文件夹
- nuget - VSTS Nuget 发布
- python - 当我们运行内部函数调用时,控制流如何跳过外部函数调用,因为它从整个代码的顶部到底部?
- kubernetes - Kubernetes 环境变量未在命令中正确使用
- mysql - 使用 MySQL 的 Laravel 迁移速度很慢
- javascript - 查找有关如何更改变量测试 js 的解决方案
- html - 在输入一个值后,输出一个带有 RADICAL(值)的字符串
- c# - C# 控制台应用程序制作完全自定义的命令