@WeiXiao: proszę abyś na przyszłość zakładał nowy wątek, bo w nim jest mowa o stronnicowaniu i robi się mały bałagan :)
Rzeczywiście, sortowanie następuje po dacie ostatniej aktywności w danym dokumencie. Dane indeksowane są w Elasticsearch. Każdy wpis na mikroblogu czy wątek to dokument. Dokument może posiadać inne dokumenty zagnieżdżone (children
) którymi są np. komentarze do wpisu na mikroblogu czy posty w wątku. Spójrzmy zatem na zapytanie do ES:
GET coyote/_search
{
"_source": [
"id",
"slug",
"replies",
"name",
"title",
"created_at",
"last_post_created_at",
"url",
"user_id",
"forum",
"text",
"user_id",
"model"
],
"from": 0,
"query": {
"bool": {
"minimum_should_match": "50%",
"must": [
{
"bool": {
"should": [
{
"bool": {
"must_not": {
"exists": {
"field": "forum.id"
}
}
}
},
{
"terms": {
"forum.id": [
422,
423,
424,
425,
426,
427,
428,
429,
449,
455,
482,
564
]
}
}
]
}
},
{
"terms": {
"model": [
"Topic",
"Job",
"Microblog",
"Wiki",
"User"
]
}
}
],
"should": [
{
"bool": {
"must": {
"match": {
"user_id": 1
}
}
}
},
{
"nested": {
"query": {
"bool": {
"must": {
"match": {
"children.user_id": 1
}
}
}
},
"path": "children",
"inner_hits": {
"size": 3,
"highlight": {
"fields": {
"children.text": {}
}
},
"_source": [
"children.id",
"children.user_id",
"children.url",
"children.created_at"
]
}
}
}
]
}
},
"sort": [
{
"children.created_at": {
"order": "desc",
"nested": {
"path": "children",
"filter": {
"exists": {
"field": "children.created_at"
}
}
}
}
}
]
}
Tutaj mamy sortowanie po dacie zagnieżdżonego dokumentu. I w tym momencie dochodzimy do sedna sprawy. Jeżeli dany dokument nie ma zagnieżdżonego dokumentu (np. wpis na mikroblogu nie posiada komentarzy), to Elasticsearch weźmie aktualną datę :( I tutaj również psuje nam się sortowanie.
Niby ES posiada opcję missing
która decyduje co robić z takimi dokumentami (czy przesuwać je na koniec czy początek). ale to nie rozwiązuje nam problemu...