ElasticSearch子元素按父元素中的字段排序

btqmn9zl  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(103)

我的应用程序中有两个实体:任务和用户。每个任务分配给一个用户。每个应用程序示例可能有数万个任务,但每个应用程序示例只有数十或数百个用户。
我想按分配的用户名对我的任务进行排序。
但是,分配的用户名称可能会随时间而改变。如果我将这些数据非规范化,那么每当用户更改其名称时,我就需要更新数百或数千个任务,我认为这可能是低效的。
ElasticSearch join字段类型感觉很适合这里,因为我有很多孩子,但父母很少。但我找不到从子级引用父级字段的方法。(或者更好的方法是根据父字段的值为子字段建立索引。)
或者,如果ElasticSearch有一个高效的批量更新API:1)不需要我将用户的所有任务加载到应用程序代码中,2)可以在一次刷新中原子地更新所有非规范化的帐户名称,那么我觉得这将是我的用例的可行解决方案。
(This应用程序实际上可以在AWS OpenSearch上运行。)

kse8i1jr

kse8i1jr1#

您可以:
1.使用批量更新进行反规范化。即直接在每个任务文档中存储所分配的用户名。当一个用户的名字改变批量更新将使它ez改变他们所有。
或者。
1.您可以使用父子关系,而不是使用ElasticSearch的join字段。
即,用户和任务的单独索引,其中任务是用户的孩子。

{
  "mappings": {
    "properties": {
      "user_id": {
        "type": "keyword"
      },
      "user_name": {
        "type": "text"
      },
      // Other user-related fields...
    }
  }
}

x

{
  "mappings": {
    "properties": {
      "task_id": {
        "type": "keyword"
      },
      "task_name": {
        "type": "text"
      },
      "user_id": {
        "type": "keyword",
        "copy_to": "parent_id"  // Copy the value to a field that will be used as the parent ID
      },
      // Other task-related fields...
    }
  }
}
POST tasks/_doc/task1
{
  "task_id": "task1",
  "task_name": "Task 1",
  "user_id": "user123",  // User ID of the user this task is assigned to
  // Other task-related fields...
}
GET tasks/_search
{
  "query": {
    "has_parent": {
      "parent_type": "users",
      "query": {
        "term": {
          "user_id": "user123"  
        }
      },
      "inner_hits": {},  
      "sort": [
        {
          "users.<FIELD_IN_PARENT>": {
            "order": "asc"  
          }
        }
      ]
    }
  }
}

的数据

相关问题