文档中带有时间戳词的搜索词组或词

问题描述

我已经尝试这样做了几天,我想是时候寻求一些帮助了。
我正在使用 elasticsearch 6.6(我相信它可以在需要时升级)并嵌套用于 c# net5。
任务是创建一个索引,其中文档是语音到文本识别的结果,其中所有已识别的单词都有一个时间戳(以便该时间戳可用于查找单词在原始文件中的位置)。媒体文件有 1000 多个文本,每个文件长度为 4 小时(通常为 5000~15000 字)。

主要思想是将每个文本分成 3 秒长的段,创建一个包含该时间段中的单词的文档,并对其进行索引以便可以搜索
我认为它不会那么好用,所以接下来的想法是为每个窗口创建一个 10~12 个单词的文档,扫描文档并每次跳跃 2 个单词,这样搜索至少可以匹配一个像样的短语,并且也有突出显示的命中。
由于它还远非完美,我认为将每个完整文本索引为文档以保持其一致性会很好,问题是与每个单词相关的时间戳。为了保持这种关系,我尝试在文档中使用嵌套对象:

PUT index-tapes-nested
{
    "mappings" : {
        "_doc" : {
            "properties" : {
                "$type" : { "type" : "text" },"ContentId" : { "type" : "long" },"Inserted" : { "type" : "date" },"TrackId" : { "type" : "long" },"Words" : {
                    "type" : "nested","properties" : {
                      "StartMillisec" : { "type" : "integer" },"Word": { "type" : "text" }
                    }
                }
            }           
        }
    }
}

这有点工作,但我不知道如何编写查询以在索引中搜索
一个非常基本的查询可以是例如:

GET index-tapes-nested/_search
{
  "query":{
    "nested":{
      "path":"Words","score_mode":"avg","query":{
        "match":{
          "Words.Word": "a bunch of things"
        }
      },"inner_hits": {}
    }
  }
}

但是类似的东西,尤其是平均得分,会给出低质量的结果;命中中可能有正确的文档,但它没有得到词序,所以不确定,也不清楚。
因此,据我所知,span_near 在这些情况下应该会派上用场,但我没有得到任何结果:

GET index-tapes-nested/_search
{
  "query": {
    "nested":{
      "path":"Words","score_mode": "avg","query": {
        "span_near": {
          "clauses": [
            { "span_term": { "Words.Word": "bunch" }},{ "span_term": { "Words.Word": "of" }},{ "span_term": { "Words.Word": "things" }}
          ],"slop": 2,"in_order": true
        }
      }
    }
  }
}

我对elasticsearch不太了解,也许我应该改方法并改变模型,也许重写查询就足够了,我不知道,这很耗时,所以真的很感激任何帮助(这是一个相当普遍的任务?)。为了简洁起见,我将删减一些内容和一些想法,如果需要,我可以提供一些数据或其他示例。
我在使用 c# nest 客户端管理嵌套索引时也遇到了问题,但那是另一回事了。

解决方法

我猜这可以用几种方式来解释,比如一个字段的“替代流”,或者每个单词的元数据,等等。我需要的是这个:https://github.com/elastic/elasticsearch/issues/5736 但它还没有完成,所以现在我想我会使用 annotated_text 插件或 10 words 窗口。
我不知道在索引单个单词的情况下是否可以有一个查询来“恢复”原始文本的完整性(这意味着 1. 按 id 将它们分组 2. 对它们进行排序)以便 elasticsearch 可以给出所需的结果.
如果有什么有趣的东西,或者如果我可以破解一些东西来获得我需要的东西(比如 require_field_match 或间隔查询),我会继续在文档中搜索。