首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSearch / ElasticSearch索引映射

OpenSearch / ElasticSearch索引映射
EN

Stack Overflow用户
提问于 2022-03-08 15:35:33
回答 1查看 649关注 0票数 0

我有一个系统,为事件摄取多个scores,我们使用opensearch (以前的弹性搜索)来获取平均值。

例如,输入类似于:

代码语言:javascript
复制
// event 1
{
  id: "foo1",
  timestamp: "some-iso8601-timestamp",
  scores: [
    { name: "arbitrary-name-1", value: 80 },
    { name: "arbitrary-name-2", value: 55 },
    { name: "arbitrary-name-3", value: 30 },
  ]
}

// event 2
{
  id: "foo2",
  timestamp: "some-iso8601-timestamp",
  scores: [
    { name: "arbitrary-name-1", value: 90 },
    { name: "arbitrary-name-2", value: 65 },
    { name: "arbitrary-name-3", value: 40 },
  ]
}

分数名称是任意的,随时会有变化。

我们最终希望查询数据以获得平均分数值:

代码语言:javascript
复制
[
  { name: "arbitrary-name-1", value: 85 },
  { name: "arbitrary-name-2", value: 60 },
  { name: "arbitrary-name-3", value: 35 },
]

然而,到目前为止,我们能够做到这一点的唯一方法是插入多个文档,每个事件中每个分数名称/值对都有一个文档。这似乎是浪费。当前的搜索是按分数名称和时间戳间隔对文档进行分组,然后对每个桶中的分数执行加权平均值。

是否有一种方法可以插入数据以允许这种查询模式发生,只需在每个事件/记录的opensearch中添加一个文档(而不是每个事件/记录每个分数添加一个文档)?那看起来怎么样?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-03-08 21:52:30

这就是你想做的吗?我有点糊涂了。^^

代码语言:javascript
复制
DELETE /71397606

PUT /71397606
{
  "mappings": {
    "properties": {
      "id": {
        "type": "text"
      },
      "scores": {
        "type": "nested",
        "properties": {
          "name": {
            "type": "keyword"
          },
          "value": {
            "type": "long"
          }
        }
      },
      "timestamp": {
        "type": "text"
      }
    }
  }
}

POST /_bulk
{"index":{"_index":"71397606"}}
{"id":"foo1","timestamp":"some-iso8601-timestamp","scores":[{"name":"arbitrary-name-1","value":80},{"name":"arbitrary-name-2","value":55},{"name":"arbitrary-name-3","value":30}]}
{"index":{"_index":"71397606"}}
{"id":"foo2","timestamp":"some-iso8601-timestamp","scores":[{"name":"arbitrary-name-1","value":90},{"name":"arbitrary-name-2","value":65},{"name":"arbitrary-name-3","value":40}]}
{"index":{"_index":"71397606"}}
{"id":"foo2","timestamp":"some-iso8601-timestamp","scores":[{"name":"arbitrary-name-1","value":85},{"name":"arbitrary-name-x","value":65},{"name":"arbitrary-name-y","value":40}]}

GET /71397606/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "nested": {
      "nested": {
        "path": "scores"
      },
      "aggs": {
        "pername": {
          "terms": {
            "field": "scores.name",
            "size": 10
          },
          "aggs": {
            "avg": {
              "avg": {
                "field": "scores.value"
              }
            }
          }
        }
      }
    }
  }
}

如果不能,你能举个例子吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71397606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档