ElasticSearch:索引.srt文件

nx7onnlm  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(146)

bounty将在5天后过期。回答此问题可获得+50声望奖励。Andy希望引起更多人对此问题的关注:srt文件很大,需要作为整个文档进行索引。用相应的时间戳索引单个句子不是我要找的。

1
00:02:17,440 --> 00:02:20,375
Hello Bob,

2
00:02:20,476 --> 00:02:22,501
how are you doing today?
...

考虑一个标准的.srt文件,它包含带有时间戳信息的文本数据,用于在客户端以正确的时间间隔显示音频。
我需要将这个文本数据索引到Elasticsearch中,同时保留时间戳信息。我目前使用的是一个自定义格式化程序,它将时间戳包含在句子中。例如:
(137)你好,鲍勃,今天过得怎么样?(142)
这表示句子开始于第137秒,结束于第142秒。
但是,我不确定这种方法是否是处理时间戳的最佳方法。

9fkzdhlc

9fkzdhlc1#

您可以为开始和结束时间戳创建一个字段,然后使用范围查询来检索相关的文本数据。当您要对时间戳相关信息进行操作时,此方法允许进行更复杂的查询和筛选。
您还可以考虑使用Elasticsearch“date”数据类型作为时间戳,允许您对数据执行基于日期的查询和聚合。

input {
  file {
    path => "/path/to/your/file.srt"
    codec => plain {
      charset => "UTF-8"
    }
  }
}

filter {
  grok {
    match => { "message" => "(?<start_timestamp>\d{2}:\d{2}:\d{2},\d{3}) --> (?<end_timestamp>\d{2}:\d{2}:\d{2},\d{3})\s+(?<text>.*)" }
  }
  date {
    match => ["start_timestamp", "HH:mm:ss,SSS"]
    target => "@timestamp"
  }
  mutate {
    remove_field => ["message"]
    convert => { "start_timestamp" => "date_time" } #conversion into a date-field
    convert => { "end_timestamp" => "date_time" }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "your_index_name"
    .
    .
    .
  }
}
xmd2e60i

xmd2e60i2#

另一种方法是使用filebeat:

filebeat.inputs:
- type: filestream
  id: srt
  paths:
    - /usr/share/filebeat/*.srt
  parsers:
    - multiline:
        type: pattern
        pattern: '^\d+$'
        negate: true
        match: after

processors:
  - dissect:
      tokenizer: "%{index}\n%{start} --> %{stop}\n%{text}"
      field: "message"
      target_prefix: "dissect"
      trim_chars: "\n"
      trim_values: "right"
  - replace:
      fields:
        - field: "dissect.start"
          pattern: "^(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})"
          replacement: "$1 h$2 m$3 s$4 ms"
        - field: "dissect.start"
          pattern: " "
          replacement: ""
        - field: "dissect.stop"
          pattern: "^(\\d{2}):(\\d{2}):(\\d{2}),(\\d{3})"
          replacement: "$1 h$2 m$3 s$4 ms"
        - field: "dissect.stop"
          pattern: " "
          replacement: ""
  - decode_duration:
      field: "dissect.start"
      format: "seconds"
  - decode_duration:
      field: "dissect.stop"
      format: "seconds"
      
output.console:
  pretty: true

相关问题