Wyszukiwarka PrestaShop

Opis działania oraz opis obsługi wyszukiwarki PrestaShop w panelu administratora z wyjaśnieniem poszczególnych składowych.

Wyszukiwarka źle (nie) działa – problem z wyszukiwarką PrestaShop

W niektórych przypadkach wyszukiwarka PrestaShop zwraca wyniki nie takie jak byśmy oczekiwali. Poukładane na pierwszy rzut oka nieprecyzyjnie/bez logicznego sensu.
Określane jako:
problem z wyszukiwarką produktów PrestaShop
– wyszukiwarka PrestaShop nie działa
– wyniki wyszukiwania PrestaShop są nie precyzyjne
– wyniki wyszukiwania są bez sensu (lub temu podobne zwroty).

Postaramy się wytłumaczyć działanie wyszukiwarki PrestaShop, żeby lepiej zrozumieć dlaczego i jak układają się produkty. Dlaczego produkty które nie powinny się pojawiać – pokazują się na pierwszym miejscu. Pomimo, że wg. nas produkt nie ma nic wspólnego z kryteriami jakie wprowadziliśmy do wyszukania.
W poniższym opisie podeprzemy się przykładem strony jednego z klientów – gdzie po wpisaniu frazy „tusz hp” produkty „tusz canon” zaczęły pojawiać się wyżej niż – tusze hp.
Na poniższym zdjęciu prezentujemy przykładowy screen wyników wyszukiwania.

 

Specyfika sklepu internetowego:
– Branża części komputerowych. Liczba pozycji asortymentowych wynosi ponad 9500 pozycji.
– Sklep zintegrowany z Wf-mag / Wapro mag.
– W nazwach produktów pojawiają się nazwy modeli – tak by można było łatwo odszukać produkt w programie do faktur.

Opis problemu wyszukiwania:
Po wpisaniu frazy „tusz hp”
Wyszukiwarka zwraca na 1134 rekordów.
Z czego w bazie mamy raptem 441 wszystkich tuszy do różnych drukarek.
A tuszy do HP 180 rekordów.
Wyniki zwrócone przez wyszukiwarkę PrastaShop są kompletnie odmienne z naszymi oczekiwaniami.
Tonery innych modeli pomieszane z różnymi produktami. Dopiero na którejś pozycji pojawiają się tusze do drukarki hp których szukamy.

Jak działa wyszukiwarka

Jak działa wyszukiwarka Prestashop:

Przyjrzyjmy się zapytaniu SQL wysyłanemu do bazy MySQL – podczas wyszukiwania produktu w sklepie internetowym na silniku PrestaShop:

SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`,
image_shop.`id_image` id_image, il.`legend`, m.`name` manufacturer_name ,(
SELECT SUM(weight)
FROM ps_search_word sw
LEFT JOIN ps_search_index si ON sw.id_word = si.id_word
WHERE sw.id_lang = 1
AND sw.id_shop = 1
AND si.id_product = p.id_product
AND (sw.word LIKE '%tusz%' OR sw.word LIKE '%hp%')
) position,
DATEDIFF(
p.`date_add`,
DATE_SUB(
"2019-12-02 00:00:00",
INTERVAL 30 DAY
)
) > 0 new
FROM ps_product p
INNER JOIN ps_product_shop product_shop
ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1)
INNER JOIN `ps_product_lang` pl ON (
p.`id_product` = pl.`id_product`
AND pl.`id_lang` = 1 AND pl.id_shop = 1
)
LEFT JOIN ps_stock_available stock
ON (stock.id_product = `p`.id_product AND stock.id_product_attribute = 0 AND stock.id_shop = 1 AND stock.id_shop_group = 0 )
LEFT JOIN `ps_manufacturer` m FORCE INDEX (PRIMARY)
ON m.`id_manufacturer` = p.`id_manufacturer`
LEFT JOIN `ps_image_shop` image_shop FORCE INDEX (id_product)
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=1)
LEFT JOIN `ps_image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = 1)
WHERE p.`id_product` IN (45,46,48,49,50,51,52,53, [USUNIĘTE ŻEBY POPRAWIĆ CZYTELNOŚĆ ZAPYTANIA] ,9403,9404)
GROUP BY product_shop.id_product
ORDER BY position desc
LIMIT 0,24

Możemy odczytać, że pozycje są układane w sposób malejący (ORDER BY position desc) wg. kolumny wynikowej position, która jest sumą wag które narzuciliśmy w panelu administracyjnym naszego sklepu internetowego : Konfiguruj->Preferencje->Szukaj->Waga.

Dla standardowego zapytania SQL (Prestashop 1.7.5.1) zwraca wyniki jak poniższa tabela:

W naszym przypadku najwyższa wartość to 102 (niestety produkt nie jest tuszem – wyszukiwarka prestashop zwróciła na pierwszym miejscu toner).
Dzieje się tak dlatego, że wyszukiwarka prestashop buduje indeks do wyszukiwania. W tabeli ps_search_word znajdują się wszystkie słowa występujące w bazie produktów. Ilość tych słów jest ograniczana minimalną długłością liter występujących w słowie. Wartość można zdeklatować w Konfiguruj->Preferencje->Szukaj->Szukaj . Domyślnie parametr jest ustawiony na 3 litery.W naszym przypadku słowo „HP” które ma 2 litery było by pomijane przy wyszukiwaniu.
Zweryfikujmy zatem tabelę ps_search_index odpytując bazę MySQL.

Jak widać zapytanie w dopasowaniu przybliżonym (LIKE '%hp%’) nasz produkt zwrócił aż 14 rekordów dając wartość 10*9+3*1=102.
Pomimo, że produkt nie jest tuszem tylko tonerem jest na pierwszym miejscu. Ponieważ w nazwie (dla którego wagę mamy ustawioną na najwyższej randze) słowo „hp” w dopasowaniu przybliżonym pojawiło się aż 10 razy. Dając najwyższą punktację i stawiając w naszym przypadku „toner” przed „tuszem” (który pasuje do mniejszej liczby modeli).

Precyzyjna wyszukiwarka PrestaShop

Rozwiązanie w naszym przypadku było dość oczywiste.
Zapytanie SQL musimy zmodyfikować tak żeby w nazwie produktu musiała pojawić się lista słów w dopasowaniu przybliżonym. Okazało się wystarczające.

Wyszukiwarka PrestaShop vs. Google

Aktualnie (bez modyfikacji pliku Search.php) PrestaShop na najwyższej pozycji stawia produkt którego wyszukiwane słowo kluczowe powtórzyło się najwięcej razy przy uwzględnieniu wagi słowa kluczowego.  Kiedyś w podobny sposób ranking budowała wyszukiwarka Google – ale z oczywistych przyczyn zostało to zabronione: https://support.google.com/webmasters/answer/66358?hl=pl .

 

Myślniki „-” w indeksach produktów / numerach katalogowych

W przypadku występowania myślnika lub myślników (znaku – [minusa]) wyszukiwarka PrestaShop dzieli słowo w miejscu występowania myślnika i zaczyna przeszukiwanie bazę dla zestawu fraz.
Dla przykładu jeżeli szukamy produktu o indeksie:
AAA-11111
Zostanie przeszukana baza dla takich słów kluczowych: AAA lub 11111 lub AAA11111 lub AAA-11111 .
Dlatego jeśli chcemy wyszukiwać precyzyjniej produkty po indeksie/numerze katalogowym produktu musimy wprowadzić odpowiednie obostrzenia na pole reference tabeli ps_product w przeciwnym razie możemy spodziewać się w wynikach wyszukiwania produktów o indeksach:
AAA-22222
BBB-11111
AAA-11111
W kolejności zgodnej ze zdefiniowanymi wagami wyszukiwarki.

Rozwiązanie:
– Do zapytania SQL można dodać treść oryginalną z myślnikiem odwołującą do pola reference w zapytaniu przybliżonym do wyrażenia.
– Za komentować w pliku PHP kod odpowiadający za przekształcenie słowa z myślnikiem.

Konfiguracja wyszukiwarki PrestaShop

Konfiguracja wyszukiwarki w PrestaShop nie jest niczym skomplikowanym. Po zalogowaniu do panelu administracyjnego sklepu należy przejść do sekcji konfiguruj wybrać Preferencje->Szukaj.
Widoczne sekcje zostaną omówione od samego dołu bo wg. nas w tej kolejności wartości powinny być ustawiane w momencie pierwszej konfiguracji.

Waga poszczególnych pól dla miejsc gdzie pojawiają się słowa kluczowe do wyszukiwania

W tym miejscu deklarujemy co jest dla nas najważniejsze.
Do wyboru mamy:

  1. Waga nazwy produktu
  2. Waga indeksu
  3. Waga krótkiego opisu
  4. Waga opisu
  5. Waga kategorii
  6. Waga marki
  7. Waga tagów
  8. Waga atrybutów
  9. Waga cech

Przykład obliczania przy założeniu że wartość Waga nazwy produktu będzie równa 1, Waga indeksu = 6, Waga krótkiego opisu = 8, szukanej frazy „hp 1010”. Dla bazy posiadającej rekordy:

  1. [nazwa] hp 1010 | [indeks] druk-hp1010-new | [krótki opis] Super drukarka ekonomiczna
  2. [nazwa] kabel usb | [indeks] kab-usb-3m | [krótki opis] Pasuje do HP 1010

To drugi rekord będzie pierwszy ponieważ fraza pojawiła się w polu o największej wadze. Za słowo hp – 8 + słowo 1010 – 8 = 16 [pkt] . Pierwszy rekord otrzyma za nazwę hp = 1[pkt] + 1010 = 1[pkt] oraz za indeks (przy założeniu wyszukiwania przybliżonego) hp = 6[pkt] + 1010 = 6[pkt]  co nam łącznie daje 14.

14<16
Zgodnie z ORDER BY position desc opisanej w sekcji jak działa wyszukiwarka PrestaShop to kabel USB pojawi się wyżej niż Drukarka HP 1010 – dlatego tak ważne jest odpowiednie dobranie wag w zależności do rodzaju treści jaki znajduje się w bazie danych sklepu internetowego.

 

Sekcja szukaj

  1. Szukaj używając części słowa
  2. Wyszukaj dopasowując zakończenia słowa
  3. Minimalna długość słowa (w znakach)
  4. Słowa zabronione

Ad1. Szukaj używając części słowa – wartość zdeklarowana na TAK odpowiada za modyfikację zapytania SQL w jak na przykładzie (sw.word LIKE '%hp%' OR ...) Baza na zapytanie „hp” zwróci hp1010 oraz hp 1010

Ad3. Minimalna długość słowa – w zależności od rodzaju produktów np. w przypadku producenta hp konieczne jest zmniejszenie domyślnej wartości trzech liter w słowie wyszukiwanym na dwie litery. W innym razie słowo w zapytaniu będzie pomijane.

Ad4. Słowa zabronione – Słowa które nie będą brały udziału przy wyszukiwaniu. Słowa nazw,opisów, … produktów – z uwzględnieniem wag większych od 0 są zapisywane do tabeli ps_search_word. Zostały wyszczególnione najpopularniejsze ale mogą pojawić się inne w zależności opisów i specyfiki danej bazy. Załóżmy, że nie wykluczylibyśmy „do” przy wyszukaniu frazy „rolka do hp” mógłby pojawić się opis produktu nie będącego rolką i nie będącą produktem hp ale w opisie słowo „do” zostało by użyte kilkanaście(kilkadziesiąt) razy. Warto rozważyć listę słów w oparciu o produkty które znajdują się w sklepie.

Przebuduj indeks wyszukiwarki

Produkty będą wyszukiwane pod warunkiem, że są w indeksie wyszukiwania tabeli ps_search_index w naszym przypadku dla 9500 produktów baza ma 250 000 rekordów (pomimo że produkty nie mają jeszcze opisów). Każde słowo z nazwy, indeksu, opisu – które spełnia nasze parametry powinno się tam znaleźć. Przykład zapytania w którym zostaje odpytana bazę o wielkość sumy wartości dla słowa przedstawia akapit Jak działa wyszukiwarka PrestaShop.
Co należy pamiętać:
– Jeśli wyszukiwarka nie wyszukuje produktów – należy zacząć od przebudowy indeksu wyszukiwarki.
– Jeśli oferta zmienia się często – zadanie przebudowy indeksu można wywołać w zadaniach CRON serwera Apache o określonych porach w zależności od potrzeby (raz dziennie, co godzinę, pół godziny).

Prawdopodobnie dla systemów zintegrowanych z zewnętrznymi zasobami przebudowa indeksu będzie wywoływana automatycznie w momencie synchronizacji produktów.

Podsumowanie

Wyszukiwarka PrestaShop jest przewidywalna i powtarzalna. Dobre przemyślenie nazw i opisów pozwoli na precyzyjne wyszukiwanie produktów. W przeciwnym razie zawsze można zmodyfikować algorytm PrestaShop – tak aby spełniał oczekiwania. Należy pamiętać, że nie jest to wyszukiwarka Google. Nie potrafi przewidzieć naszych intencji czy zachowań behawioralnych.

Zamów wycenę
Polityka prywatności | Regulamin
Pro-link 2005-2020