在带有时间戳的单词的文档中搜索短语或单词
search phrase or words in document with timestamped words
几天来我一直在尝试这样做,我想是时候寻求一点帮助了。
我正在使用 elasticsearch 6.6(我相信如果需要它可以升级)并嵌套 c# net5。
任务是创建一个索引,其中的文档是语音到文本识别的结果,其中所有已识别的单词都有一个时间戳(以便该时间戳可用于查找原始文件中说出该单词的位置).媒体文件中有 1000 多个文本,每个文件时长 4 小时(通常是 5000~15000 字)。
主要想法是将每个文本分成 3 秒长的片段,用该时间片段中的单词创建一个文档,并对其进行索引以便进行搜索。
我认为它不会那么好用,所以下一个想法是为每个 window 的 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": {}
}
}
}
但是类似的东西,尤其是平均得分,给出了低质量的结果; 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 个单词 window.
我不知道在索引单个单词的情况下是否可以查询 'restores' 原始文本的完整性(这意味着 1. 按 id 对它们进行分组 2. 对它们进行排序)以便 elasticsearch 可以提供期望的结果。
如果有什么有趣的东西,或者我是否可以破解一些东西来获得我需要的东西(比如 require_field_match 或间隔查询),我会继续在文档中搜索。
几天来我一直在尝试这样做,我想是时候寻求一点帮助了。
我正在使用 elasticsearch 6.6(我相信如果需要它可以升级)并嵌套 c# net5。
任务是创建一个索引,其中的文档是语音到文本识别的结果,其中所有已识别的单词都有一个时间戳(以便该时间戳可用于查找原始文件中说出该单词的位置).媒体文件中有 1000 多个文本,每个文件时长 4 小时(通常是 5000~15000 字)。
主要想法是将每个文本分成 3 秒长的片段,用该时间片段中的单词创建一个文档,并对其进行索引以便进行搜索。
我认为它不会那么好用,所以下一个想法是为每个 window 的 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": {}
}
}
}
但是类似的东西,尤其是平均得分,给出了低质量的结果; 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 个单词 window.
我不知道在索引单个单词的情况下是否可以查询 'restores' 原始文本的完整性(这意味着 1. 按 id 对它们进行分组 2. 对它们进行排序)以便 elasticsearch 可以提供期望的结果。
如果有什么有趣的东西,或者我是否可以破解一些东西来获得我需要的东西(比如 require_field_match 或间隔查询),我会继续在文档中搜索。