• 嵌套排序
    • 以嵌套栏位排序

    嵌套排序

    以嵌套栏位排序

    我们可以依照嵌套栏位中的值来排序,甚至藉由分离嵌套文档中的值。为了使其结果更加有趣,我们加入另一个记录:

    1. PUT /my_index/blogpost/2
    2. {
    3. "title": "Investment secrets",
    4. "body": "What they don't tell you ...",
    5. "tags": [ "shares", "equities" ],
    6. "comments": [
    7. {
    8. "name": "Mary Brown",
    9. "comment": "Lies, lies, lies",
    10. "age": 42,
    11. "stars": 1,
    12. "date": "2014-10-18"
    13. },
    14. {
    15. "name": "John Smith",
    16. "comment": "You're making it up!",
    17. "age": 28,
    18. "stars": 2,
    19. "date": "2014-10-16"
    20. }
    21. ]
    22. }

    想像我们要取回在十月中有收到回应的blog文章,并依照所取回的各个blog文章中最少stars数量的顺序作排序。
    这个搜寻请求如下:

    1. GET /_search
    2. {
    3. "query": {
    4. "nested": { <1>
    5. "path": "comments",
    6. "filter": {
    7. "range": {
    8. "comments.date": {
    9. "gte": "2014-10-01",
    10. "lt": "2014-11-01"
    11. }
    12. }
    13. }
    14. }
    15. },
    16. "sort": {
    17. "comments.stars": { <2>
    18. "order": "asc", <2>
    19. "mode": "min", <2>
    20. "nested_filter": { <3>
    21. "range": {
    22. "comments.date": {
    23. "gte": "2014-10-01",
    24. "lt": "2014-11-01"
    25. }
    26. }
    27. }
    28. }
    29. }
    30. }

    <1> nested查询限制了结果为十月份收到回应的blog文章。

    <2> 结果在所有匹配的回应中依照comment.stars栏位的最小值(min)作递增(asc)的排序。

    <3> 排序条件中的nested_filter与主查询query条件中的nested查询相同。 於下一个下方解释。

    为什么我们要在nested_filter重复写上查询条件? 原因是排序在於执行查询后才发生。
    此查询匹配了在十月中有收到回应的blog文章,回传blog文章文档作为结果。
    如果我们不加上nested_filter条件,我们最後会依照任何blog文章曾经收到过的回应作排序,而不是在十月份收到的。