Wyszukiwanie artykułów na stronie

Witam. Na mojej stronie internetowej będzie można dodawać artykuły, i o ile wiem jak się zabrać za ich przechowywanie i samo ich dodawanie, to nie wiem, jak będzie można je wyszukiwać.

Artykuły będą przechowywane w bazie danych. Na stronie głównej powinna być wyszukiwarka, która nam odnajdzie artykuły z tej bazy. Tylko nie wiem jak to zrobić. Nie wiem na przykład, czy powinienem korzystać z tagów. Po pierwsze - jak je posegregować w bazie danych, po drugie - co jeśli jakiś użytkownik doda ze 100 tagów, tylko po to żeby jego artykuł pojawiał się wszędzie, po trzecie jak przekształcić zapytanie użytkownika, by sprawdzało tagi?
Np. jeśli ktoś w tagach doda “Linux”, a ktoś napisze “Instalacja Linuxa”, to słowo “Linux” różni się od “Linuxa”. Można by niby zrobić tak, że jeśli ciąg znaków w wyrazie będzie pasował z tagiem, to to zadziała. No ale niezupełnie, bo np. ktoś może wpisać “Car”, a jakieś artykuły w tagach będą miały “_Car_pet” i wraz z autami pokaże mu się masa dywanów.

Można by też przekształcić tytuł w tagi, tylko co jeśli tytuł będzie czymś typu “Dlaczego Mac’i nie nadają się do grania”, a artykuł będzie też opowiadał w dużej mierze o komputerach PC i o Windowsie? Wtedy, jeśli ktoś wpisze “Dlaczego lepiej grać na Windowsie” ten artykuł mu nie wyskoczy.

Wyszukiwarka będzie raczej nieodłączną częścią mojej strony. Chcę wszystko zrobić tak, bym później nie musiał się martwić zmianami w bazie danych, np. dodaniem pola na tagi czy czegoś innego, i przez to nie dodałem jeszcze opcji dodawania artykułów. Chcę by wszystko było przygotowane, i dopiero wtedy dodam opcję dodawania artykułów.

Przeszukiwałem internet, by znaleźć rozwiązanie. Jedyne co znalazłem, to jakieś poradniki jak dodać wyszukiwanie Google do strony, jak zrobić wyszukiwarkę internetową (a chcę by przeszukiwała tylko moją stronę) oraz gotowe skrypty - jeśli nie będzie wyjścia, to może kiedyś ich użyję, ale chciałbym to zrobić samemu.

Jak się więc za to zabrać? Jakie są rozwiązania powyższych problemów? Jak przechowywać tagi? Na czym wyszukiwanie w ogóle powinno się opierać?

Tagi i wyszukiwarka to dla mnie całkiem inne rzeczy.

Tagi możesz z góry określić i dać użytkownikowi możliwość przypisania np max 5 (z jakimś podpowiadaniem itp) Dzięki temu ludzi będą mogli kliknąć taga przy artykule i znaleźć podobne. Możesz zrobić chmurę tagów do klikania itp.

Wyszukiwarka to druga sprawa, najprostsze rozwiązanie to szukanie w SQL: WHERE ‘treść’ LIKE “%fraza%”, ale to się sprawdzi tylko na początku. Jest to wolne i obciążające bazę. Są takie rzeczy jak ElasticSearch ale to już duże działo na Twój problem. Zrób to w najprostszy sposób i jak dojdziesz do punktu gdy to rozwiązanie nie będzie wystarczające poszukasz innego.

Nie odpowiada mi takie rozwiązanie, bo boję się tego “później”, czyli co jeśli np. będę miał 1000 artykułów, i każdy ich rekord w bazie danych musiałby być zmieniony, bo np. byłoby dodane jakieś pole lub odjęte…
Wolę mieć dobrze zaplanowane wszystko od samego początku.

Według mnie dobrym pomysłem byłoby połączenie tagów i tytułu - tytuł zamieniany byłby na mniejsze tagi, a tagi które sam wybierze użytkownik będą opisywać treść. Tylko właśnie wystąpić mogą problemy jakie opisałem powyżej, czyli np. ktoś wpisze car i pojawi mu się carpet. Czy to dobry pomysł?

Obojętnie co zrobisz to później możesz zmieniać tabelę w bazie danych, zmiany to normalna rzecz. Nie jesteś w stanie wszystkiego przewidzieć i zaplanować.

Robienie tagów z tytułu niekoniecznie się sprawdzi, tytuły mogą nie zawierać kluczowych słów dla danego artykułu.

Wiem, że w przyszłości będą jakieś zmiany, ale boję się, że dodam np. nową kolumnę do tabeli artykuły z dodatkowymi tagami czy czymś innym, i jakieś 1000 obecnych artykułów będzie miało tę kolumnę pustą i będzie trzeba to uzupełniać.

Poza tym, źle mnie chyba zrozumiałeś. Użytkownik będzie miał 2 pola do wypełnienia - tytuł oraz tagi. Artykuł nazwie np. “Recenzja The Legend of Zelda: Breath of the Wild”, a w tagach doda np. “recenzja, najlepsza, gra, nintendo, switch”. Jeśli ktoś wyszuka “Najlepsza gra na Nintendo Switch” wyskoczy mu ten artykuł, bo zapytanie pasuje do tagów. Jeśli wyszuka “Recenzja Breath of the Wild” też mu się pokaże ten artykuł, bo zapytanie pasuje do tytułu.

Doszedłem do siebie po ColdZlocie i mogę odpisać :stuck_out_tongue:

Jeśli będziesz miał tagi to one na moje nie powinny być w osobnej kolumnie :wink:
Masz tabelkę z artykułami:
id | tytuł | treść
z tagami:
id | tag
np:
1 | programowanie
2 | podróże
i łączysz to w taki sposób:
id_artykułu | id_taga
np:
1 | 1
1 | 2

Obojętnie w jaki sposób zapiszesz coś w bazie danych dla poprzednich artykułów nie będziesz posiadał tej informacji. Jeśli będziesz chciał dodać jakąś informację aby wszystkie artykuły to miały to niestety będzie to dużo pracy.

Co do drugiego akapitu.

Wiem że się czepiam ale tag “najlepsza” chyba nie jest tu dobrym przykładem :stuck_out_tongue:

Na moje wyszukiwarki szukają po treści/tytule a nie po tagach, tagi służą do trochę innych rzeczy.

Nie wiem czy za bardzo sobie nie komplikujesz pomysłu. Frazę użytkownika musiałbyś rozbijać na pojedyncze słowa, ograć jakoś odmiany słów, wyszukać artykuły które posiadają wszystkie dane tagi. Nie dosyć że to dużo pracy, niełatwe zadanie ale moźe też być wolne :wink:

I nad odpowiedziami na naturalne pytania w stylu “Jaka jest najlepsza gra na Nintendo Switch” pracują najwięksi, np Google, to nie jest łatwy temat.