Elasticsearch 按嵌套数组中的嵌套字段排序

问题描述

我使用的是 ElasticSearch 7.2.1 和 nesT 7.2.1

我的数据结构如下

{
  id: "some_id","roles" : [
  {
    "name" : "role_one_name","members" : [
    {
      "id" : "member_one_id","name" : "member_one_name",}
    ]
  },{
    "name" : "role_two_name","members" : [
    {
      "id" : "member_two_id","name" : "member_two_name",}
    ]
  ]
}

这个想法是我需要按给定的角色名称(例如role_one_name)实现排序。 应该对 members.name 进行排序(例如 members[0].name)。在我的例子中, members 数组将始终包含一个元素,但对于某些角色(示例中省略),它包含多个元素,因此我无法摆脱嵌套数组。

在我的脑海中,我有一个算法:

  1. 名称获取所需角色。
  2. 指定成员数组中第一个元素的路径。
  3. 指向要排序的名称属性

我是弹性搜索领域的新手,经过几天的尝试,我得到了以下查询(不起作用)。

var sortFilters = new List<Func<FieldSortDescriptor<T>,FieldSortDescriptor<T>>>(); 
var sortFieldValue = "role_two_name";
...

sortFilters.Add(o => o.nested(n => n
    .Path(p => p.Roles)
    .Filter(f => f
        .Term(t => t
            .Field(c => c.Roles.First().Name)
            .Value(sortFieldValue)) && f
        .nested(n => n
            .Path(p => p.Roles.First().Members)
            .Query(q => q
                .Term(t => t
                    .Field(f => f.Roles.First().Members.First().Name)))))));

我做错了什么?

解决方法

在同事的帮助下,我设法解决了这个问题。

GET index_name/_search
{
 "from": 0,"size": 20,"query": {
    "match_all": {}
  },"sort": [{
      "roles.members.name.keyword": {
        "order": "asc","nested": {
          "path": "roles","filter": {
            "term": {
              "roles.name.keyword": {
                "value": "sortFieldValue"
              }
            }
          },"nested": {
            "path": "roles.members"
          }
        }
      }
    }
  ]
}

或使用 NEST:

sortFilters.Add(o => o.Field(f => f.Roles.First().Members.First().Name.Suffix("keyword")));

sortFilters.Add(o => o.Nested(n => n
    .Path(p => p.Roles)
    .Filter(f => f
        .Term(t => t
            .Field(q => q.Roles.First().Name.Suffix("keyword"))
            .Value(sortFieldValue)
        )
    )
    .Nested(n => n
        .Path(p => p.Roles.First().Members)
    )
));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...