当前位置: 首页 > 面试题库 >

Elasticsearch-“星期几”的DateTime映射

黎震博
2023-03-14
问题内容

我在课堂上有以下财产:

public DateTime InsertedTimeStamp { get; set; }

通过ES中的以下映射

"insertedTimeStamp ":{
    "type":"date",
    "format":"yyyy-MM-ddTHH:mm:ssZ"
},

我想进行汇总以返回按“星期几”分组的所有数据,即“星期一”,“星期二” …等

我知道我可以在聚合调用中使用“脚本”来执行此操作,但是,据我了解,如果有很多文档,使用脚本不会对性能产生不小的影响。

有没有一种方法可以用“子属性”映射属性。即我可以用一个字符串:

"somestring":{
    "type":"string",
    "analyzer":"full_word",
    "fields":{
        "partial":{
            "search_analyzer":"full_word",
            "analyzer":"partial_word",
            "type":"string"
        },
        "partial_back":{
            "search_analyzer":"full_word",
            "analyzer":"partial_word_back",
            "type":"string"
        },
        "partial_middle":{
            "search_analyzer":"full_word",
            "analyzer":"partial_word_name",
            "type":"string"
        }
    }
},

全部具有.net代码中类的单个属性。

我可以做一些类似的事情来分别存储“完整日期”,然后分别存储“年”,“月”和“天”等(在索引时间存储某种“脚本”),还是我需要在存储中添加更多属性?上课并分别映射它们?这是Transform所做的吗?(现在已贬值,因此似乎表明我需要单独的字段…)


问题答案:

使用索引pattern_capture过滤器在索引编制时绝对可以做到这一点。

首先,您需要为每个日期部分定义一个分析器+令牌过滤器组合,并将每个分配给日期字段的子字段。每个令牌过滤器将仅捕获其感兴趣的组。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "year_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "year"
          ]
        },
        "month_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "month"
          ]
        },
        "day_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "day"
          ]
        },
        "hour_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "hour"
          ]
        },
        "minute_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "minute"
          ]
        },
        "second_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "second"
          ]
        }
      },
      "filter": {
        "year": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "(\\d{4})-\\d{2}-\\d{2}[tT]\\d{2}:\\d{2}:\\d{2}[zZ]"
          ]
        },
        "month": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "\\d{4}-(\\d{2})-\\d{2}[tT]\\d{2}:\\d{2}:\\d{2}[zZ]"
          ]
        },
        "day": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "\\d{4}-\\d{2}-(\\d{2})[tT]\\d{2}:\\d{2}:\\d{2}[zZ]"
          ]
        },
        "hour": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "\\d{4}-\\d{2}-\\d{2}[tT](\\d{2}):\\d{2}:\\d{2}[zZ]"
          ]
        },
        "minute": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "\\d{4}-\\d{2}-\\d{2}[tT]\\d{2}:(\\d{2}):\\d{2}[zZ]"
          ]
        },
        "second": {
          "type": "pattern_capture",
          "preserve_original": false,
          "patterns": [
            "\\d{4}-\\d{2}-\\d{2}[tT]\\d{2}:\\d{2}:(\\d{2})[zZ]"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "date": {
          "type": "date",
          "format": "yyyy-MM-dd'T'HH:mm:ssZ",
          "fields": {
            "year": {
              "type": "string",
              "analyzer": "year_analyzer"
            },
            "month": {
              "type": "string",
              "analyzer": "month_analyzer"
            },
            "day": {
              "type": "string",
              "analyzer": "day_analyzer"
            },
            "hour": {
              "type": "string",
              "analyzer": "hour_analyzer"
            },
            "minute": {
              "type": "string",
              "analyzer": "minute_analyzer"
            },
            "second": {
              "type": "string",
              "analyzer": "second_analyzer"
            }
          }
        }
      }
    }
  }
}

然后,当您为日期编入索引(例如)时2016-01-22T10:01:23Z,您将获得每个填充了相关部分的日期子字段,即

  • date2016-01-22T10:01:23Z
  • date.year2016
  • date.month01
  • date.day22
  • date.hour10
  • date.minute01
  • date.second23

然后,您可以随意在任何这些子字段上进行汇总以获得所需的内容。



 类似资料:
  • 问题内容: 我有一个类似于以下的DataFrame (摘录,“ Timestamp”是索引): 我需要一个新列,分别包含时间戳记的星期几/星期几。 我怎么能得到这个? 问题答案: 使用新属性: 在索引是的情况下,您需要重置索引,然后调用该属性: 奇怪的是,如果您尝试从索引创建一个序列以不重置索引,您将像使用的结果调用属性那样获得值,而没有将结果赋回原始df: 编辑 正如用户@joris向我指出的那

  • 问题内容: 我有以下类型的文件: 我想按星期几计算文件数。例如,x消息在星期一发送,y消息在星期二发送,依此类推。 我已经使用date_histogram进行汇总,但是它会按日向我返回文档。它确实返回了当天,但是说“ 22周三”和“ 29周三”作为单独的汇总文档返回。 这在某种程度上与Elasticsearch有关-按星期和小时的天分组,但是该问题没有答案,因此我将其重新发布。根据那里的建议,它要

  • 问题内容: 我有当前日期,还有一个常数,它指示星期几。我想基于该常数获取一周的开始日期。如果我将一周的第一天硬编码为星期一(或其他任何东西),那么这很简单。但是一周的第一天一直在变化。因此,我不想在每次更改第一天时都更改代码。 这是我尝试使用Java的Calendar的方法: 我想获取一周的开始日期。上面的函数返回星期的第一天,并且星期开始日期被硬编码为星期六。每当星期开始日期以上的要求发生变化时

  • 本文向大家介绍Win10下C# DateTime出现星期几问题的解决方法,包括了Win10下C# DateTime出现星期几问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToString 解决。 也有部分人说可以修改系统时间的显示,我打算试一下看看行不行。 Date

  • 问题内容: 在crontab中,星期几字段是从还是从? 我看到与此相关的信息冲突。我见过的维基百科州和其他网站都是。 同时这将是暗示或或者使用或不正确?也就是说,cron还会继续运行吗? 问题答案: 而这两种立场星期天,你可以使用你想要的,所以写0-6或1-7具有相同的结果。 此外,通过@Henrik的建议,也可以按天数,如缩短名称来代替数字,等: 图形化: 最后,如果要逐日指定,则可以用逗号分隔

  • 问题内容: 如何获得当前一周的星期一和星期五的日期? 我有以下代码,但是如果当前日期是星期日或星期六,则它将失败。 问题答案: 这些strtotime输入效果很好: 您需要做的就是将逻辑包装在一些if语句中。