Paginacja niezbyt dobrze działa

5

Wyszukujemy postów spamu kogoś, kto ma go bardzo dużo typu [CIACH!]

https://4programmers.net/Search?q=somekind

i pojawia się ostatni page jako 415

screenshot-20210404125330.png

gdy klikniemy np. na 2 to zostanie wykonane przejście

screenshot-20210404125407.png

ale gdy klikniemy na 415, to url będzie OK https://4programmers.net/Search?q=somekind&page=415, ale UI już nie

screenshot-20210404125423.png

a dodatkowo gdy wejdziemy na ten url z page=415 bezpośrednio, to

screenshot-20210404125503.png

na stronie 414 też tak to się zachowuje

Proponowane tymczasowe rozwiązanie problemu: pozbycie się userów z ogromną liczbą postów - @somekind, @Shalom itp

2

U mnie działa. Zgaduje że licznik uwzględnia posty w działach których nie widzisz (albo usunięte posty których nie widzisz?) i dlatego liczba stron się nie zgadza, więc to nie kwestia spamerów tylko moderatorów :)
Kiedyś juz tak było z liczbą postów w wątku, że usunięte liczyły się do generowania liczby stron wątku i dla nie-moderatorów skutkowało to np. stroną która miała 0 postów.

Jednak masz racje, dla wyszukiwarki powyżej 100 strony się sypie. Myślałem początkowo ze chodziło o szukanie postów danego usera a nie postów z danym słowem.

1

Wydaje mi się, że chodzi o limit 100 lub 101 stron. Dla ciągu znaków java:

  • https://4programmers.net/Search?q=java&page=100 – zwraca wyniki, brak błędu w konsoli;
  • https://4programmers.net/Search?q=java&page=101 – zwraca komunikat The given data was invalid., a w konsoli dwa błędy: TypeError: window.hits is null oraz TypeError: hits is null.

Podobnie dla ciągu znaków javascript.


UPDATE Przeglądarka: Firefox 87.0


PS Dla ciągu znaków java liczba stron pokazywanych w paginacji wynosi 2533, a dla ciągu znaków javascript807.

1

https://github.com/adam-boduch/coyote/issues/560

To jest związane z ograniczeniem samego Elastisearch.

1

nie potrafię zrozumieć jak działa ten nasz forumowy search i od 15min uprawiam gimnastykę aby znaleźć wątek o architektach

wiem że @Shalom miał tam posta, więc szukam po jego ostatnich postach

order by data i author Shalom

i dostaje takie cudo - przecież to nie jest orderniętę po dacie jego postu, a dacie ostatniej aktywności w tym wątku (kogokolwiek), a przynajmniej tak to wygląda, a zatem jest to bezużyteczne trochę

screenshot-20210411171007.png

1

następne podejście do odnalezienia moich architektów:

Szukam po architekt i OrderBy Date - to jest pierwsza strona, wynik 2019 - no cóż, no to może na ostatniej będą najnowsze?

screenshot-20210411171240.png

a nie, jednak 2002.

screenshot-20210411171324.png

0

przecież to nie jest orderniętę po dacie jego postu, a dacie ostatniej aktywności w tym wątku (kogokolwiek), a przynajmniej tak to wygląda, a zatem jest to bezużyteczne trochę

no tak, bo teraz ten temat się pojawia u niego :D

screenshot-20210411172155.png

1

@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...

1

@Adam Boduch: nie bardzo rozumiem. @WeiXiao zasugerował, że sortowanie wyników wyszukiwania wątków zawierających posty użytkownika X następuje po dacie napisania ostatniego posta w danym wątku przez jakiegokolwiek użytkownika, a nie po dacie napisania ostatniego posta w tym wątku przez użytkownika X. To chyba nie ma związku z zagnieżdżeniem dokumentów? (Mówiąc mimochodem: ciekawa informacja o tych dokumentach, dzięki).

0

@Adam Boduch:

Tak jak napisał @Silv, nie jestem pewien czy mówimy o tym samym przypadku

Tu problemem jest taki, że np. user X napisał w temacie post w roku 2005, a user Y napisze post w tym samym wątku post w 2021 i gdy wyszukamy posty usera X po dacie, to ten post z 2005 pojawi się na górze, co jest bez sensu.

0

@WeiXiao: tak, wiem o co chodzi. O to mi chodziło w moich poprzednim poście (może źle się wyraziłem).

0

Aktualnie zepsuta jest paginacja w wynikach wyszukiwania.
Na oko wydaje się że nie działają strony od 2 do 9.

Przeglądarka Vivaldi.

1

Dzięki za zgłoszenie. Wkradła się literówka i już leci poprawka na serwer.

0

@Adam Boduch: na GitHubie w tej issue napisałeś:

Limit zostal podniesiony do 1500 stron wyszukiwania

Natomiast gdy wyszukuję np. frazę go i przechodzę do ostatniej strony – numer 3072 – to paginacja przechodzi na stronę nr 1000. Czemu nie 1500? Coś źle zrozumiałem?

0

No tak. Trzeba było jeszcze ograniczyć liczbę wyświetlanych stron po stornie front endu ;) Poprawiłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1