Wyszukiwarka - niedokładna + losowa kolejność wyników

3

Szukam frazy "zabezpieczenie przed dekompilacją". Tylko pierwsze trzy wyniki zawierają szukaną frazę, reszta zawiera jedno lub drugie słowo. Skoro szukam frazy złożonej z kilku słów, to zależy mi, żeby każde słowo było znalezione, a nie tylko część z nich.

Wyszukiwarka gubi mnóstwo wyników. Fraza obfuskacja daje 6 wyników, tymczasem google dla hasła obfuskacja site:4programmers.net daje wyników 557.

Wyniki mają przypadkową kolejność, przez co znalezienie czegoś sensownego jest czasami utrudnione. Poniżej poprzeplatane wyniki z 2003, 2010,2005, 2016.
screenshot-20200505101441.png
Moim zdaniem powinny być posortowane od najnowszego do najstarszego. Fajnym ficzerem byłoby umożliwienie ustawienia sortowania (data utworzenia wątku, data najnowszej odpowiedzi, trafność). W tej chwili chyba są sortowane według trafności, ale w takim wypadku i tak wyniki z tym samym lub zbliżonym rank'iem powinny mieć kolejność po dacie.

Brakuje możliwości szukania w konkretnym dziale forum. Zwykle obchodzą mnie posty dla konkretnego języka programowania, więc jeśli szukam czegoś dla C#, a wyskakują mi wyniki z js, to stanowią tylko szum.

Brakuje szukania w komentarzach.

0

Moim zdaniem powinny być posortowane od najnowszego do najstarszego

screenshot-20200505105812.png

Brakuje możliwości szukania w konkretnym dziale forum.

screenshot-20200505105841.png

Brakuje szukania w komentarzach.

true that

2

To ja bym jeszcze dodał, żeby wyszukiwanie mozna było wyświetlić pogrupowane po tematach, nie postach.

2

Wyszukiwarka będzie wkrótce przebudowywana. Przede wszystkim będzie jedna zamiast 2. @Patryk27 post @ŁF odnosi się właśnie do szukarki głównej.

Pamiętajmy, że 4programmers to nie tylko forum. Źródłem danych są modele o różnej strukturze jak wpisy na mikroblogu, oferty pracy czy wątki. Podstawowa trudność to szukanie w różnych źródłach danych a następnie prezentacja wyników z różnych źródeł.

PS. Możesz zobaczyć jeszcze ten post w wątku: https://4programmers.net/Forum/1670982

2
Patryk27 napisał(a):

screenshot-20200505105812.png
...
screenshot-20200505105841.png

O RLY?
screenshot-20200506113706.png

4

Absolutnie konieczne do zmiany jest to, by dało się wymusić szukanie wszystkich wyrazów. Jak szukam foo bar, to absolutnie nie interesują mnie wyniki, gdzie jest tylko foo albo tylko bar. Chyba, że zechcę inaczej, np. foo OR bar albo dowolny inny format. Póki tego nie będzie, wyszukiwarka dla mnie nie ma sensu i "nie działa". Przed chwilą się właśnie o to rozbiłem szukając aqq jabber user:marooned.

0

Myślę że w elasticu dane trzeba będzie trzymać w formie zagnieżdżonych obiektów, czyli np. tak:

{
"id" : 334284,
"score" : 3,
"slug" : "problemy_z_pw_po_zmianach_w_trybie_czatu",
"replies" : 10,
"subject" : "Problemy z PW po zmianach / w trybie czatu",
"last_post_created_at" : "2019-12-24T16:46:12+01:00",
"decay_date" : "2019-12-24T16:46:12+01:00",
"url" : "/Forum/Coyote/334284-problemy_z_pw_po_zmianach_w_trybie_czatu",
"user_id" : 90224,
"posts" : [
    {
        "created_at" : "2019-12-23T15:28:16+01:00",
        "text" : "..."
        "url" : "/Forum/Coyote/334284-problemy_z_pw_po_zmianach_w_trybie_czatu?p=1641745#id1641745",

        "user_id" : 64311
    },
    { ... }
  ]
}

Wyobraźcie sobie jak ten JSON będzie wyglądał np. w przypadku wątku "Trochę humoru" ;)
Podstawowa trudność jest taka, że gdy wątek zawierający dane szukane słowo, to nie wiem jak pobrać ID postu w którym się ono znajduje aby utworzyć URL.

Co do layoutu, to myślę, że wyniki wyszukiwania powinny być podzielone na zakładki. W zakładce Wszystkie byłby prezentowane wyniki w formie takiej jak np. na google. Po kliknięciu w zakładkę "Forum" - w formie listy wątków, a "Mikroblogi" - w formie ... mikroblogów :)

@Marooned: da się zmienić na AND ale mimo że elastic domyślnie działa na OR to wyżej punktuje wyniki wyszukiwania które zawierają obydwa słowa (pewnie znajdujące się jeszcze blisko siebie). Dopiero jak nie znajdzie dokumentu zawierającego obydwa słowa, prezentuje zawierające co najmniej jedno z nich. Podobnie zdaje się działa google.

Jak coś to elastic obsługuje operatory + oraz | i to już działa w wyszukiwarce głównej. Zobacz ten wynik: https://4programmers.net/Search?q=adam+marooned a następnie ten https://4programmers.net/Search?q=adam+%2B+marooned

4
Adam Boduch napisał(a):

Podstawowa trudność jest taka, że gdy wątek zawierający dane szukane słowo, to nie wiem jak pobrać ID postu w którym się ono znajduje aby utworzyć URL.

Ok, udało mi się to osiągnąć w elasticu. Dla ciekawych zapytanie:

GET coyote/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "simple_query_string": {
            "query": "test",
            "fields": ["subject^2"]
          }
        },
        {
          "nested": {
            "path": "posts",
            "query": {
              "simple_query_string": {
                "query": "test",
                "fields": ["posts.text"]
              }
            },
            "inner_hits": {}
          }
        }
      ]
    }
  }
}

Takie zapytanie szuka zarówno w tytule (ustawiając mu większą wagę) jak i w treści postu oraz zwraca znaleziony post.
Jesteśmy na dobrej drodze :)

0

Dopiero jak nie znajdzie dokumentu zawierającego obydwa słowa, prezentuje zawierające co najmniej jedno z nich
Nope. Najpierw są te zawierające więcej słów kluczowych, potem te zawierające mniej. Czyli IMO kolejność brana z rank'a.

Jeszcze brakuje sensownej kolejności - wątki zawierające to samo szukane słowo powinny mieć kolejność wg daty malejąco. Inaczej pierwszym wynikiem jest post z 2003 r., drugim z 2011, trzecim z 2002 (ależ stare mamy to nasze forum) - tak jest Adamie w wynikach pierwszego linku, który podałeś. W świecie IT, gdzie wszystko błyskawicznie się starzeje, kolejność po dacie może być nawet ważniejsza od trafności.

1
ŁF napisał(a):

Jeszcze brakuje sensownej kolejności - wątki zawierające to samo szukane słowo powinny mieć kolejność wg daty malejąco. Inaczej pierwszym wynikiem jest post z 2003 r., drugim z 2011, trzecim z 2002 (ależ stare mamy to nasze forum) - tak jest Adamie w wynikach pierwszego linku, który podałeś. W świecie IT, gdzie wszystko błyskawicznie się starzeje, kolejność po dacie może być nawet ważniejsza od trafności.

Jak najbardziej się z Tobą zgadzam :) Dlatego elasticsearch daje mechanizmy umożliwiające wpływanie na score, które należy zaimplementować. Takie mechanizmy mogą obniżać score gdy np. szukany przez Ciebie hotel jest dalej od Twojego miejsca zamieszkania (bardziej promować te blisko Ciebie). W naszym przypadku natomiast - obniżać finalny score danego dokumentu wraz z jego wiekiem.

Elastic oblicza score danego dokumentu w oparciu o wiele różnych czynników. Np. szukasz adam boduch. Sortując po dacie wyszukasz dokumenty zawierające te słowa gdziekolwiek. Mogą występować razem, mogą osobno albo może występować jedno z nich (zależy od ustawień). W przypadku sortowania po score, elastic oblicza czy:

  • te słowa występują jedno po drugim
  • częstotliwość występowania danego słowa/słów
  • czy szukane słowa występują w kilku polach czy tylko w jednym
  • ... wiele innych czynników o których nie wiem :)
1

Jestem na ostatniej prostej jeżeli chodzi o przepisanie szukarki. Póki co przyjąłem, że silnik nie ingeruje w score dokumentów starszych niż 180 dni. Po tym czasie, z każdym dniem traci 0.1 punkta w score obniżając wynik starszych dokumentów. Oczywiście są to wartości domyślne, możemy zmniejszyć tę liczbę i obniżając score już wcześniej.

2

Wstawiłem do testów póki co na serwerze deweloperskim: https://4programmers.dev/Search?q=php

  • Mamy możliwość filtrowania wyników po różnych typach danych (forum, mikroblogi)
  • Możliwość wyboru kilku kategorii z forum
  • Indeksowanie również komentarzy do mikroblogów
  • Przełączając się na zakładkę "Forum", mamy widok forumowy, na pozostałych jest inny widok. Nic nie stoi jednak teraz na przeszkodzie aby po przełączeniu się na zakładkę Mikroblogi, wyświetlać wyniki w formie listy mikroblogów
  • Działają operatory " czy +

Z minusów:

  • nadal nie są indeksowane komentarze do postów :( Elasticsearch ma domyślnie limit wynoszący 10k zagnieżdżonych obiektów JSON podczas indeksowania. Wątek "Trochę humoru" ma już +8k i niestety wydajność obrywa gdy w wynikach wyszukiwania pojawia się ten wątek. Mimo, że ja w wynikach wyszukiwania chce mieć zwrócone tylko kilka pól, to elastic musi tak czy siak, załadować całego JSON-a z dysku i następnie usuwać z niego niepotrzebna pola. To zajmuje czas i "Trochę humoru" w wynikach wyszukiwania powoduje spowolnienie całego procesu 10x :( Nie wiem co się stanie jak jeszcze komentarze w tym wątku się z indeksuje ;)
0
  1. Kliknalem na link: https://4programmers.dev/Search?q=php
  2. Pozniej zakladka watki z forum
  3. wjescie w watek helloword php
  4. przycisk wstecz cofa do JSON-a:

screenshot-20200525165809.png

Ale sama zmiana mi sie bardzo podoba

0

Widok Wszystkie na pewno wymaga pracy nad stylami, bo obecnie wyniki są strasznie nieczytelne, jakby wręcz styli zabrakło.

Też mi się zdarzyło dostać to co @Panczo, jak wróciłem stamtąd tu korzystając z historii, a potem znów dałem na przód w historii. Kolejna próba już przeszła ok.

0

Macie racje, należy obsłużyć przycisk Wstecz jeszcze.
@Marooned: być może to kwestia cloudflare znowu. Wyłączyłem tymczasowo.

1

Nie no, style są, ale jak dla mnie, to jest tu kompletny chaos i w sumie nie wiem co jest czym, jakaś powtórzona treść php echo "sasa"; die;, wypunktowana, dwie daty, nie wiadomo która do czego, ja tak prezentowanych wyników nie rozumiem.
screenshot-20200526110349.png

1

Poprawiłem nieco style. Czy teraz jest lepiej? Ta zdublowana treść to po prostu testowe posty, dwa następujące po sobie zawierające tę samą treść.

2

Uaktualnienie: na score danego dokumentu wpływa również score dokumentów zagnieżdżonych (czyli postów w przypadku wątków oraz komentarzy na mikroblogu). Dokładnie to sumowany jest score zagnieżdżonych dokumentów.

Aktualnie ponownie indeksowana jest treść całego serwisu.

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