ElasticSearch按嵌套字段值排序

时间:2013-06-04 23:08:21

标签: php symfony elasticsearch

我需要按照下一个顺序对结果进行排序:

  • 用户,我关注
  • 关注我的用户
  • 所有其他用户

我的用户看起来像这样:

{
    "username": "admin"
    "followers": [
        {
            "id": 2,
            "username": "kiehn.nicola2"
        },
        {
            "id": 3,
            "username": "adaline253"
        },
        {
            "id": 4,
            "username": "skuhic4"
        }
    ],
    "following": [
        {
            "id": 2,
            "username": "kiehn.nicola2"
        },
        {
            "id": 3,
            "username": "adaline253"
        },
        {
            "id": 4,
            "username": "skuhic4"
        },
        {
            "id": 5,
            "username": "heaney.garth5"
         }
    ]
}

有可能吗?

当然,我知道当前的用户ID和用户名。

我编写此查询,但它不起作用(例如,用户ID为1):

{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "username": {
                            "value": "*a*",
                            "boost": 1
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "following.username": {
                "order": "asc",
                "nested_path": "following",
                "nested_filter": {
                    "term": {
                        "following.id": 1
                    }
                }
            },
            "followers.username": {
                "order": "asc",
                "nested_path": "followers",
                "nested_filter": {
                    "term": {
                        "followers.id": 1
                    }
                }
            }
        }
    ],
    "size": 40
}

1 个答案:

答案 0 :(得分:1)

我会通过提升来做到这一点;提升搜索者在其关注者身上获得的点击量,然后以较低的值提升搜索者在其“关注”字段中的点击次数:

注意:在此示例中,搜索者的ID为55

"query": {
   "bool": {
       "should": [
           {
               "nested": {
                   "path": "followers",
                   "query": {
                       "term" : { "followers.id": { "value": 55, "boost": 3.0 } }
                   }
               }
           },
           {
               "nested": {
                   "path": "following",
                   "query": {
                       "term" : { "following.id": { "value": 55, "boost": 2.0 } }
                   }
               }
           },
           {
               "match_all": { "boost": 1.0 }
           }
       ]           
   }

}

如果搜索者处于热门追随者字段中,那么搜索者就会关注该搜索,因此提升率最高,等等...

你说你想要所有其他用户,最后是"match_all: {}查询。