Elasticsearch按匹配数组项排序

4

我在索引文档中有以下结构:

document1: "customLists":[{"id":8,"position":8},{"id":26,"position":2}]
document2: "customLists":[{"id":26,"position":1}]
document3: "customLists":[{"id":8,"position":1},{"id":26,"position":3}]

我能够使用匹配查询"customLists.id = 26"搜索属于给定列表的匹配文档。但是我需要根据该列表中的位置值对文档进行排序,并忽略其他列表的位置。

所以预期结果应按照文档2、文档1、文档3的顺序排列。

这种排序是否适用于数据结构,如何处理?


在你的问题中,“忽略其他列表的位置”是什么意思? - Richa
如果我使用customLists.id=26进行搜索,那么我只对该项中的position值感兴趣 {"id":26,"position":5}。 - Petteri H
无法理解您的意思。请分享您想要的样本输出? - Richa
1个回答

4
一种实现此目的的方法是将 customLists 的映射类型设置为嵌套类型,然后使用嵌套字段排序

示例:

1)创建索引和映射

put test
put test/test/_mapping
{
   "properties": {
      "customLists": {
         "type": "nested",
         "properties": {
            "id": {
               "type": "integer"
            },
            "position": {
               "type": "integer"
            }
         }
      }
   }
}

2) 索引文档:

    put test/test/1 
    {
     "customLists":[{"id":8,"position":8},{"id":26,"position":2}]
    }
    put test/test/2
    {
    "customLists":[{"id":26,"position":1}] 
    }

   put test/test/3
   {
      "customLists":[{"id":8,"position":1},{"id":26,"position":3}]
   }

3) 根据给定的id按位置排序的查询

post test/_search
    {
       "filter": {
          "nested": {
             "path": "customLists",
             "query": {
                "term": {
                   "customLists.id": {
                      "value": "26"
                   }
                }
             }
          }
       },
       "sort": [
          {
             "customLists.position": {
                "order": "asc",
                "mode": "min",
                "nested_filter": {
                   "term": {
                      "customLists.id": {
                         "value": "26"
                      }
                   }
                }
             }
          }
       ]
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接