Autocomplete w polu wyszukiwarki

7

Od pewnego czasu kłębi mi się w głowie pewien pomysł i jak zwykle postanowiłem się tym z Wami podzielić ;) Sam do końca nie mam jeszcze w głowie poukładane jak to miałoby działać.

Otóż nie chodzi tutaj o klasyczny autocomplete w polu wyszukiwania.

Założenia:

  • przejście do pola wyszukiwania za pomocą skrótu klawiaturowego.
  • na starcie ładuje się zestaw pogrupowanych linków. Np. mogą to być moje wątki, wątki w których brałem udział, obserwowane wątki, dodane ogłoszenia o prace, ostatnio szukane hasła itp. Wszystko sterowane z klawiatury co umożliwiałoby szybkie przejście, np. do wątku w którym ostatnio brałem udział.
  • w miarę wpisywania kolejnych znaków szukarka musiałaby prezentować wyniki pogrupowane wg. kategorii, czyli wyniki wyszukiwania w całym serwisie, wyniki wyszukiwania w obserwowanych wątkach, wśród użytkowników itp.

Myślałem, że za taki autocomplete może przełączać się w różne tryby, w zależności od wpisanego znaku. Przykładowo, wpisuje znak > i mam listę "poleceń" do wykonania. Polecenia to zestaw przydatnych linków takich jak: "Dodaj ogłoszenie o pracę", "Znajdź moje posty", "Pokaż nowe posty od ostatniej wizyty", "Nowa wiadomość prywatna". Taki zestaw umożliwiłby szybką nawigację do elementów serwisu (oczywiście też wszystko sterowane z klawiatury).

Z kolei, wpisując znak @ szukarka przełączałaby się w tryb wyszukiwania użytkowników, dzięki czemu moglibyśmy przejść do wiadomości prywatnych (konwersacji) z daną osobą.

Przyznam, że nie mam jeszcze wszystkiego przemyślnego. Ot, taka luźna koncepcja. Nie powiem - projekt jest ambitny. Myślicie, że warto w to inwestować?

Oczywiście nad grafiką należałoby jeszcze popracować, ale chodzi mi w dużym uproszczeniu o coś takiego:

screenshot-20200326201703.png

4

Gdzieś już widziałem taki pomysł i według mnie na +, ludzie klepiący dużo w terminalu może mieliby lepszy sposób na poruszanie się po forum

A New, Experimental User Interface

ZgrqFFnmywO9apvzBbJy.gif
0

Mnie się pomysł bardzo podoba, w szczególności ze względu na automatyzację i intuicyjność (oby tylko została zapewniona).

0

Zapowiada się spore wyzwanie. Myślę, że to zadanie można podzielić na 3 części.

Widok startowy

Gdy użytkownik przejdzie do pola wyszukiwania (klawiaturą lub myszką) należy wyświetlić widok startowy umożliwiający szybki dostęp do przydatnych informacji. Co byście tutaj widzieli? Może to być np.:

  • lista wątków w których brałem udział (np. 5 ostatnich pozycji posortowane według daty)
  • lista moich wątków
  • lista obserwowanych wątków
  • użytkownicy z którymi ostatnio wymieniałem wiadomości (np. 2-3 pozycje)
  • dodane ogłoszenia o pracę
  • obserwowane ogłoszenia o pracę
    ...

Autocomplete w Elasticsearch

Tutaj zaczyna się trudność. Elasticsearch posiada mechanizm autocomplete. My będziemy musieli pogrupować jednak wyniki wyszukiwania. O ile pogrupowanie według kategorii takich jak "Forum", "Mikroblogi" czy "Praca" nie będzie problemem, tak nasuwa się pytanie jak to zrobić w przypadku np. kategorii "Obserwowane wątki". Myślę, że w Elasticsearch trzeba po prostu zapisywać ID użytkowników, którzy obserwują dany wątek i w ten sposób grupować powstałe wyniki. Dana podstrona może należeć do różnych kategorii (np. "Forum", "Obserwowane wątki", "Moje wątki") tak więc dochodzi filtrowanie wyników.

Polecenia/komendy

Po wpisaniu np. znaku > możemy wyświetlić listę przydatnych linków np.:

  • Znajdź moje wątki
  • Znajdź moje posty
  • Wł/wył przyklejony pasek menu
    ...

Jakie opcje tutaj byście widzieli? Super jakby dało się tutaj umieścić opcje w zależności od podstrony na której się znajdujemy. Np. w przypadku gdy czytamy dany wątek, można by było tutaj umieścić "Wł/wył obserwowanie wątku".

0
Adam Boduch napisał(a):

Zapowiada się spore wyzwanie. Myślę, że to zadanie można podzielić na 3 części.

Widok startowy

Gdy użytkownik przejdzie do pola wyszukiwania (klawiaturą lub myszką) należy wyświetlić widok startowy umożliwiający szybki dostęp do przydatnych informacji. Co byście tutaj widzieli? Może to być np.:

  • lista wątków w których brałem udział (np. 5 ostatnich pozycji posortowane według daty)
  • lista moich wątków
  • lista obserwowanych wątków
  • użytkownicy z którymi ostatnio wymieniałem wiadomości (np. 2-3 pozycje)
  • dodane ogłoszenia o pracę
  • obserwowane ogłoszenia o pracę
    ...

Rozróżnienie:

  • Na desktopie, gdybym sam robił dla siebie, nie widziałbym nic… po prostu puste pole wyszukiwania. Ewentualnie – jakiś prosty komunikat zachęcający do niego (dymek, placeholder itp.; np. Cóż Waćpan(na) wyszukać dziś pragniesz? :P). Tak minimalistycznie. Lista przypominajek pojawiałaby się dopiero po naciśnięciu strzałki w dół (może też być spacja, ponieważ domyślam się, że leading spaces nie będą uwzględniane przy wyszukiwaniu).
  • Na urządzeniu mobilnym lista przypominajek pokazywałaby się tak, jak napisałeś – od razu po otrzymaniu focusa przez pole wyszukiwania.

Super jakby dało się tutaj umieścić opcje w zależności od podstrony na której się znajdujemy.

Tak, mnie się to też wydaje dobre rozwiązanie.

0

Zacząłem już pracować nad tą funkcjonalnością.

Możemy np. zindeksować tytuły wątków i ustawić wagi do każdego z wątku. Domyślnie ten mechanizm działa tak że podpowiada wyniki rozpoczynające się od danego prefiksu. Załóżmy, że mamy tytuł wątku Iphone czy Android?. Po wpisaniu słowa iphone, oczywiście podpowie ten tytuł. Natomiast po wpisaniu android - już nie. Na szczęście możemy zindeksować kilka wariantów danej frazy, proponuje więc do 3 wyrazów. czyli iphone czy android', 'czy android' oraz 'android`. Myślę, że do każdej trzeba nadać inną wagę. Do pełnego zdania waga 3, potem 2 i na końcu 1 (najsłabsza).

Dodatkowo chciałbym jeszcze przypisać wyższa wagę do podstron, które są nowsze. Dodatkowo algorytm wagowy może brać pod uwagę popularność wątku (liczbę odsłon), liczbę jego ocen. Np. po wpisaniu ile, szukarka może podpowiadać na 1 miejscu wątek ile zarabiacie ponieważ jest dość popularny. Jakieś pomysły?

0

Dodatkowa waga dla nowszych zdecydowanie na plus. Liczba odpowiedzi albo liczba łapek (dla pierwszego postu? może sumarycznie per wątek? choć nie wiem, czy taka informacja jest od ręki dostępna) też jest jakąś miarą atrakcyjności wątku.

0

Ok, pomożecie obmyślić jakiś wzór?

coś a la:

waga = (1 * ilosc_odpowiedzi) + (2 * ilosc_lapek_w_gore) + (( timestamp_napisania_ostatniego_posta - timestamp_roku_2000) / 600000)

0

Zmiana tych wag jest ciężka? Jeśli nie, to może jakieś sliderki na dev.4p (hm, tam nie ma danych, to by tu musiało być) i analiza wyników celem dobrania sensownych wartości?

0
Adam Boduch napisał(a):

Możemy np. zindeksować tytuły wątków i ustawić wagi do każdego z wątku. Domyślnie ten mechanizm działa tak że podpowiada wyniki rozpoczynające się od danego prefiksu. Załóżmy, że mamy tytuł wątku Iphone czy Android?. Po wpisaniu słowa iphone, oczywiście podpowie ten tytuł. Natomiast po wpisaniu android - już nie. Na szczęście możemy zindeksować kilka wariantów danej frazy, proponuje więc do 3 wyrazów. czyli iphone czy android', 'czy android' oraz 'android`. Myślę, że do każdej trzeba nadać inną wagę. Do pełnego zdania waga 3, potem 2 i na końcu 1 (najsłabsza).

Nie jestem przekonany, czy to dobre rozwiązanie, żeby w ogóle nie podpowiadał. Moim zdaniem podpowiedzi powinny być generowane dla wszystkich wątków, których tytuły zawierają np. podciąg iphone (ograniczony oczywiście spacjami*, żeby jednak jakąś wydajność i odpowiedniość zachować). Natomiast jedynie wyświetlanie powinno ucinać listę sztywno do X wartości od początku (posortowaną po wagach malejąco).


UPDATE: * Spacjami albo innymi znakami, np. ,, ., ;.

0

Tak, dość ciężka. Trzeba wszystko jeszcze raz wrzucić do elasticsearch.

@Marooned: wstawiłem ostatnie 1000 wątków z kategorii Off-topic do Excela. Możesz sobie popatrzeć: https://docs.google.com/spreadsheets/d/1to9CIRXwlHP50BnqAcO6anrwaUEMzQdrGyEoZQi28_s/edit?usp=sharing

Jak masz pomysł na poprawę tych warunków to daj znać na priv a ustawie Ci możliwość edycji tego arkusza.

0

Uwzględniając te, które, @Adam Boduch i @Marooned, podaliście, mnie przychodzą do głowy następujące parametry w tym wzorze. Można z nich wybrać (bez szczególnej kolejności) do wzoru kilka, można wszystkie. Żaden nie ma jednostki.

  • odpowiedniość dopasowania treści tytułu względem wyszukiwanego wzorca — skala: [0,1), interpretacja: więcej = lepiej ( @Adam Boduch )
  • odpowiedniość dopasowania treści pierwszego posta względem wyszukiwanego wzorca — skala: [0,1), interpretacja: więcej = lepiej
  • liczba głosów dla pierwszego postu (w domyśle: na wątek) — skala: [0,inf), interpretacja: więcej = lepiej ( @Adam Boduch, @Marooned )
  • sumaryczna liczba głosów ze wszystkich postów w wątku — skala: [0,inf), interpretacja: więcej = lepiej (?) ( @Marooned )
  • średnia liczba komentarzy na post — skala: [0,inf), interpretacja: więcej = lepiej (?)
  • liczba odsłon — skala: [0,inf), interpretacja: więcej = lepiej ( @Adam Boduch )
  • liczba uczestników — skala: [1,inf), interpretacja: więcej = lepiej
  • liczba postów — skala: [1,inf), interpretacja: ? ( @Marooned )
  • czas między datą założenia wątku a datą ostatniej jego aktywności — skala: ?, interpretacja: ?
  • czas między datą ostatniej aktywności a chwilą wyszukiwania — skala: ?, interpretacja: ?
  • (bardzo opcjonalnie) rozkład aktywności w czasie — skala: [0,1), interpretacja: więcej = szczyt bliżej dnia dzisiejszego = ?
  • czas między napisaniem ostatniego posta a rokiem 2000 (początek roku?) — skala: ?, interpretacja: ? ( @Adam Boduch )

Jeszcze mam pytanie: co to jest to "600000"?


PS. Jeszcze to może uzupełnię później (chyba że, @Adam Boduch, już wdrożysz jakiś wzór, będzie działać i nie będzie potrzeba ;) ).


UPDATE: Kolejne aktualizacje tego postu przeniosłem do innego wątku, o tu: Algorytm obliczający wagę w mechanizmie autocomplete

0

600000 to liczba sekund w tygodniu (w przybliżeniu). Właśnie wszystko rozchodzi się o wzór/algorytm.

Wiele rzeczy o których piszesz nie da się zrobić. Mechanizm completition w elasticsearch jeść dość prosty. Jest jedynie fraza do wyszukiwania i waga. Musi tak być ponieważ musi to być piekielnie szybkie. Jeżeli byśmy chcieli brać pod uwagę liczbę odsłon, to należałoby przeliczać wagę za każdym odświeżeniem wątku.

Polecę z tym tematem do działu "Algorytmy", może ktoś pomoże.

0

Moja 1 próba zmierzenia się z designem tego zadania:

screenshot-20200402091722.png

Nie wiem co, ale coś mi tutaj się nie podoba ;)

0
Adam Boduch napisał(a):

@Marooned: wstawiłem ostatnie 1000 wątków z kategorii Off-topic do Excela. Możesz sobie popatrzeć: https://docs.google.com/spreadsheets/d/1to9CIRXwlHP50BnqAcO6anrwaUEMzQdrGyEoZQi28_s/edit?usp=sharing

Tylko nie wiem, czy sama waga coś mówi o wątku bez kontekstu wyszukiwanej frazy? Jak będę szukał czegoś z dołu listy, to te z góry będą wyżej, bo mają wyższą wagę? Hm

0

Oczywiście, musi być fraza + waga, ale w excelu możesz sobie filtrować po tytule wątku, symulując działanie mechanizmu autocomplete. Zobacz mój post: Algorytm obliczający wagę w mechanizmie autocomplete a w szczególności screenshot.

0

Ok, kolejna propozycja graficzna, która bardziej już mi się podoba.

screenshot-20200402101013.png

Kategorie mają mniejszy font, nie przyciągają tak uwagi. Dodatkowe ikony akcji oczywiście pojawiałyby się dopiero po naprowadzeniu kursora nad daną pozycję.

0

W całym serwisie linki są zielone, więc tu pierwsza propozycja była bardziej spójna w tym temacie.

0

Oczywiście, tutaj jest pole do dyskusji jednak w mechanizmach autocomplete w całym serwisie (podpowiadanie nazwy usera czy tagu) jednak linki nie są zielone.

0

A dałoby się przy okazji poprawić wyszukiwarkę, by działała zgodnie z intuicją?
Próbowałem wyszukać moje posty o starym kompie, wpisałem E-1505 oraz E1505, oba wyniki szukały jakbym wpisał E 1 5 0 5, każdy znak osobno. Nawet "E1505" nie pomogło (" chyba nic nie robi?). Nie tak to powinno działać.

0

To już temat na osobny wątek, ale jak najbardziej. Zgłaszajcie takie przykłady. To jest akurat domyślnie działanie dla elasticsearch. Np. jak wpiszesz tick-tak to rozbije to na 2 osobne słowa i będzie szukąc tick oraz tack. Widocznie liczby też rozbija, ale tego akurat nie byłem świadom.

Co jest na chwilę obecną zrobione:

  • brak rozróżniania PL znaków
  • niektóre słowa dodane do ignorowanych (np. "tak", "i")
  • brak usuwania znaków _, # czy +. Jak widać trzeba dodać jeszcze -
1
Marooned napisał(a):

A dałoby się przy okazji poprawić wyszukiwarkę, by działała zgodnie z intuicją?
Próbowałem wyszukać moje posty o starym kompie, wpisałem E-1505 oraz E1505, oba wyniki szukały jakbym wpisał E 1 5 0 5, każdy znak osobno. Nawet "E1505" nie pomogło (" chyba nic nie robi?). Nie tak to powinno działać.

Poprawka już leży na git. Dodałem unit testa aby testować tego typu przypadki.

1

To ja tez pomarudze :)
https://4programmers.net/Forum/Search?q=user%3Aiksde+python&f=
oraz
https://4programmers.net/Forum/Search?q=python+user%3Aiksde&f=
zwracaja inne wyniki. Pewnie w pierwszym przypadku szuka usera iksde python, ale podpowiedz po prawej sugeruje, ze jak nie zamkniemy nazwy uzytkownika w cudzyslow to wszystko po spacji nie bedzie juz traktowane jak czesc jego nazwy.

4

Mam już pierwszą, działającą wersję. Napisałem mikroserwis w node.js. Działa to bardzo szybko:

screenshot-20200407204145.png

Nie wiem jeszcze jak rozwiązać problem, aby w podpowiedziach nie było stron do których zwykli użytkownicy nie mają dostępu ;) Elasticsearch w tym zakresie nie oferuje jakiegoś zaawansowanego filtrowania danych. Nie wiem czy nie będę musiał tego robić w node.js, po otrzymaniu wyników.

Na chwilę obecną zapytanie do elasticsearch wygląda tak:

POST coyote/_search?pretty
{
  "suggest": {
    "user_suggestions": {
      "prefix": "ile",
      "completion": {
        "field": "suggest",
        "size": 5,
        "skip_duplicates": true,
        "contexts": {
          "category": [
            {
              "context": "subscriber:1",
              "boost": 1
            },
            {
              "context": "user:1",
              "boost": 3
            },
            {
              "context": "users:1",
              "boost": 2
            }
          ]
        }
      }
    },
    
    "all_suggestions": {
      "prefix": "ile",
      "completion": {
        "field": "suggest",
        "skip_duplicates": true,
        "size": 5,
        "contexts": {
          "model": [
            "Topic"
          ]
        }
      }
    }
  }
}

Tak naprawdę mamy tutaj dwa zapytania. Jedno wyciąga 5 pasujących wątków, posortowane wg. wagi zindeksowanej w elastic. Drugie zapytanie natomiast wyciąga 5 wątków, ale spersonalizowanych pod danego użytkownika. I tak ustawione są tutaj dodatkowe mnożniki (boost) dla wagi. Większy priorytet będą miały moje wątki, które ja założyłem, dalej te w których brałem udział i na końcu te obserwowane.

Minusem jest tutaj możliwe zdublowanie wyników, z którym sobie jeszcze nie poradziłem. Zaletą natomiast większa rozbieżność wyników. Sam nie jestem do końca przekonany czy takie podejście jest właściwe :) Chyba czas pokaże.

2

Wystawiłem wersję do testów jakby ktoś miał ochotę spojrzeć: https://4programmers.dev

0

@Adam Boduch: nie wiem, czy to już było proponowane: czy nie dałoby się zrobić tak, by po wpisaniu np. k r, tj. "k-spacja-r" wyszukiwało wszystkie słowa, które mają litery "k" oraz "r" na pozycjach nienastępujących po sobie? Obecnie wyszukiwanie ze spacją nie wyszukuje, zdaje się, nic.


PS. Takie wyszukiwanie jest np. w Firefoxie w pasku adresu. A jeśli dałoby się zrobić, to zamiast pozwalania na jedną spację, myślę, dobrze, by wyszukiwarka pozwalała na ciąg spacji o dowolnej długości.

0

Nie sądzę (nie wiem) czy jest taka możliwość.

Pytanie jeszcze jaki skrót klawiaturowy powinien rozwijać listę (wywoływać focus na polu wyszukiwania)? Obecnie dałem Ctrl+spacja

0
Adam Boduch napisał(a):

Pytanie jeszcze jaki skrót klawiaturowy powinien rozwijać listę (wywoływać focus na polu wyszukiwania)? Obecnie dałem Ctrl+spacja

Nie mam zdania (może dobry, może niedobry). W Firefoxie CTRL+SPACE według tej strony ma tylko jedno przypisanie, i to niezwiązane z elementami strony -> https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly Ale należałoby rozważyć skróty systemu operacyjnego, środowiska graficznego, innych "pośrednich" programów i oczywiście innych przeglądarek.


PS. Z komentarza @iksde -> Autocomplete w polu wyszukiwarki widać, że CTRL+SPACE nie działa (=jest zajęte?) na Macu.

2

Użyłem skrótu Ctrl+spacja bo to pierwsze co mi przyszło do głowy.

Myślę jednak że powinniśmy iść tropem innych serwisów: dobrą praktyką jest ustalanie skrótów jednoliterowych aby nie wprowadzać możliwych konfliktów ze skrótami OS czy przeglądarki. Zatem proponuje iść tropem np. github, google dosc, jira itp. Skrótem do pola wyszukiwania powinien być znak /.

1
Adam Boduch napisał(a):

(…) Zatem proponuje iść tropem np. github, google dosc, jira itp. Skrótem do pola wyszukiwania powinien być znak /.

W Firefoxie (na przykład) klawisz / oznacza właśnie wyszukiwanie – dokładnie funkcję Quick Find (tu tu). Ja nie mam nic przeciwko ustawieniu takiego samego skrótu na 4p, nawet z tego w FF nie korzystam. Ale nie wiem, czy inni nie chcieliby tej funkcji przeglądarki zachować.

Moim zdaniem najprostsze rozwiązanie to pozwolić użytkownikowi włączać i wyłączać skróty 4p w ustawieniach konta.


PS. A umożliwiwszy konfigurację skrótów w ustawieniach konta, można dodać jakikolwiek skrót. Wtedy np. ja byłbym za /.

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