【问题标题】:Sorting documents by value in one of nested documents按嵌套文档之一中的值对文档进行排序
【发布时间】:2015-02-09 05:13:12
【问题描述】:

我在根据所选嵌套文档中的值对文档进行排序时遇到问题。我正在使用这样的设置:

curl -XPUT 'http://127.0.0.1:9200/test/' -d '
index :
    number_of_shards : 1
    number_of_replicas : 1
'


curl -XPUT '127.0.0.1:9200/test/item/_mapping' -d '
{
"item" : {
 "properties" : {
  "name" : {"type" : "string", "store": "yes"},
  "children" : {
   "properties" : {
     "name" : {"type" : "string", "store": "yes"},
     "id" : {"type" : "integer", "store": "yes"},
     "size" : {"type" : "integer", "store": "yes"}
   },
   "type": "nested"
  }
 }
}
}' 


curl -XPUT 'http://localhost:9200/test/item/1' -d '{
    "name" : "item1",
    "children": [
      {
        "id": 11,
        "size": 15
      }, 
      {
        "id":3,
        "size": 6
      }
     ]
    }
}'
curl -XPUT 'http://localhost:9200/test/item/2' -d '{
    "name" : "item2",
    "children": [
      {
        "id": 1,
        "size": 2
      }, 
      {
        "id":3,
        "size": 6
      }
     ]
    }
}'
curl -XPUT 'http://localhost:9200/test/item/3' -d '{
    "name" : "item3",
    "children": [
      {
        "id": 1,
        "size": 7
      }, 
      {
        "id":3,
        "size": 36
      }
     ]
    }
}'
curl -XPUT 'http://localhost:9200/test/item/4' -d '{
    "name" : "item4",
    "children": [
      {
        "id": 1,
        "size": 11
      }, 
      {
        "id":3,
        "size": 16
      }
     ]
    }
}'

我要检索的是具有选定子 ID 的文档,这些文档将按选定的子大小排序。所以查询看起来像:

    curl -XGET 'http://127.0.0.1:9200/test/item/_search?pretty=1'  -d '
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "filter": {
            "term": {
              "id": 1
            }
          },
          "path": "children"
        }
      }
    }
  },
  "sort": [
    {
      "children.size": {
        "order": "asc",
        "nested_filter": {
          "nested": {
            "filter": {
              "term": {
                "id": 1
              }
            },
            "path": "children"
          }
        }
      }
    }
  ]
}
'

在这个查询中,无论我在“order”字段中输入什么(asc 或 desc),返回的文档都是相同的顺序。可能有什么问题?

【问题讨论】:

    标签: sorting elasticsearch


    【解决方案1】:

    看起来您构建nested filter 的方式不正确。您在此处列出的内容也对我不起作用。

    但是当我替换这个时:

    "sort": [
        {
          "children.size": {
            "order": "asc",
            "nested_filter": {
              "nested": {
                "filter": {
                  "term": {
                    "id": 1
                  }
                },
                "path": "children"
              }
            }
          }
        }
    ]
    

    用这个:

    "sort": [
       {
          "children.size": {
             "order": "desc",
             "nested_filter": {
                "term": {
                   "id": 1
                }
             }
          }
       }
    ]
    

    成功了。

    更准确地说,我建立了索引并添加了您的数据:

    DELETE /test_index
    
    PUT /test_index/
    {
        "settings": {
            "number_of_shards": 1,
            "number_of_replicas": 0
        }
    }
    
    PUT /test_index/item/_mapping
    {
       "item": {
          "properties": {
             "name": {
                "type": "string",
                "store": "yes"
             },
             "children": {
                "properties": {
                   "name": {
                      "type": "string",
                      "store": "yes"
                   },
                   "id": {
                      "type": "integer",
                      "store": "yes"
                   },
                   "size": {
                      "type": "integer",
                      "store": "yes"
                   }
                },
                "type": "nested"
             }
          }
       }
    }
    
    PUT /test_index/item/1
    {"name":"item1","children":[{"id":11,"size":15},{"id":3,"size":6}]}
    
    PUT /test_index/item/2
    {"name":"item2","children":[{"id":1,"size":2},{"id":3,"size":6}]}
    
    PUT /test_index/item/3
    {"name":"item3","children":[{"id":1,"size":7},{"id":3,"size":36}]}
    
    PUT /test_index/item/4
    {"name":"item4","children":[{"id":1,"size":11},{"id":3,"size":16}]}
    

    然后搜索如下,用"order": "desc",好像按预期工作:

    POST /test_index/item/_search
    {
       "query": {
          "filtered": {
             "query": {
                "match_all": {}
             },
             "filter": {
                "nested": {
                   "filter": {
                      "term": {
                         "id": 1
                      }
                   },
                   "path": "children"
                }
             }
          }
       },
       "sort": [
          {
             "children.size": {
                "order": "desc",
                "mode": "avg",
                "nested_filter": {
                   "term": {
                      "id": 1
                   }
                }
             }
          }
       ]
    }
    ...
    {
       "took": 2,
       "timed_out": false,
       "_shards": {
          "total": 1,
          "successful": 1,
          "failed": 0
       },
       "hits": {
          "total": 3,
          "max_score": null,
          "hits": [
             {
                "_index": "test_index",
                "_type": "item",
                "_id": "4",
                "_score": null,
                "_source": {
                   "name": "item4",
                   "children": [
                      {
                         "id": 1,
                         "size": 11
                      },
                      {
                         "id": 3,
                         "size": 16
                      }
                   ]
                },
                "sort": [
                   11
                ]
             },
             {
                "_index": "test_index",
                "_type": "item",
                "_id": "3",
                "_score": null,
                "_source": {
                   "name": "item3",
                   "children": [
                      {
                         "id": 1,
                         "size": 7
                      },
                      {
                         "id": 3,
                         "size": 36
                      }
                   ]
                },
                "sort": [
                   7
                ]
             },
             {
                "_index": "test_index",
                "_type": "item",
                "_id": "2",
                "_score": null,
                "_source": {
                   "name": "item2",
                   "children": [
                      {
                         "id": 1,
                         "size": 2
                      },
                      {
                         "id": 3,
                         "size": 6
                      }
                   ]
                },
                "sort": [
                   2
                ]
             }
          ]
       }
    }
    

    这是我使用的代码:

    http://sense.qbox.io/gist/1582560ed13bec82dc321944a639336ad7ae6a60

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2019-12-03
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多