MySQL FullText seach

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
Sektor
Użytkownik
Posty: 271
Rejestracja: 2004-08-28, 12:21
Lokalizacja: Kraków

MySQL FullText seach

Post autor: Sektor »

Witam,

Mam 2 kolumny 'product' i 'brand', polaczone relacja 1-1 w tabeli product mam kolumne brandid bedaca kluczem obcym do kolumny id tabeli brand.

Jak zrobic wyszukiwarke ktora znajdzie produkt po wpisaniu slowa marki i kawalka frazy produktu ?

np. szukam "Buty Adidas", i chce znalezc product o kolumnie name "Buty sportowe" i marce o kolumnie name "Adidas" (sa polaczone relacja)

Da sie to zrobic jednym zapytaniem ?

Pozdrawiam
mati0712
Użytkownik
Posty: 65
Rejestracja: 2007-05-18, 20:05

Re: MySQL FullText seach

Post autor: mati0712 »

jeśli product i brand to tabele, a kolumna brand w tabeli brand zawiera nazwę marki, kolumna product w tabeli product zawiera nazwę produktu, to zapytanie może wyglądać tak:

Kod: Zaznacz cały

select * from brand, product where brand.brand = "adidas" and product.product like "%buty%" and product.brandid = brand.id
Awatar użytkownika
Sektor
Użytkownik
Posty: 271
Rejestracja: 2004-08-28, 12:21
Lokalizacja: Kraków

Re: MySQL FullText seach

Post autor: Sektor »

Dziekuje,

ale jesli otrzymujesz na wejsciu stringa w postaci "xxx yyy" i nie wiesz ktora czesc jest nazwa marki a ktora nazwa produktu, moze ktos szukac "buty adidas" a moze szukac "adidas buty" lub nawet "buty sportowe adidas" lub "buty sportowe".

Powinno sie to zrobic na FullText search tylko nie wiem jak to sensownie ulozyc, bo nie wychodzi to co powinno...

Pozdrawiam
mati0712
Użytkownik
Posty: 65
Rejestracja: 2007-05-18, 20:05

Re: MySQL FullText seach

Post autor: mati0712 »

W FullText search sie nie orientuje, ale mozna zrobic to w inny sposób: podzielic szukany tekst na wyrazy i szukac kazdego w jednej i drugiej tabeli. Nie wiem tylko jak wydajnie to będzie działać.

Kod: Zaznacz cały

SELECT * FROM brand, product WHERE ((brand.brand like "%slowo1%") or (brand.brand like "%slowo2%")) and ((product.product like "%slowo1%") or (product.product like "%slowo2%")) and product.brandid = brand.id
Awatar użytkownika
Matti
Użytkownik
Posty: 124
Rejestracja: 2005-05-20, 23:42
Lokalizacja: Kraków/Trzebinia

Re: MySQL FullText seach

Post autor: Matti »

Wszystko zależy od ilości rekordów ale wydaje mi się, że jak dobrze założysz indeksy na odpowiednie kolumny to na tego typu wyszukiwanie nie powinieneś odczuć spadku wydajności.
:ok:
Awatar użytkownika
xil
Moderator
Posty: 862
Rejestracja: 2004-06-20, 22:20
Lokalizacja: Białystok
Kontakt:

Re: MySQL FullText seach

Post autor: xil »

Sektor, po pierwsze, to nie relacja 1-1, ale 1-n. po drugie skoro masz relacje 1-n i chcesz uzywac obu tabel, to powinienes zrobic calkowicie inaczej te tabele.

skoro slowo buty to brand, a adidas to produkt, to zapewne masz kilka roznych butow adidas, ktore maja ten sam brand_id. powinienes to zrobic tak:

brand_id - product_id - company_id, kazda z nich ma:
brand: branze
product: nazwe
company: nazwe

calosc laczy jedna tabela z trzema id, produkt, nazwa, marka.

zeby to zoptymalizowac do wyszukiwania ta tabela powinna posiadac skonkatenowane wszystkie nazwy ze soba(tak to nie bedzie baza znormalizowana, ale zdenormalizowana specjalnie), wtedy szukanie odbedzie sie tylko na przestrzeni jednej tabeli i maksymalnie jednego indeksu nalozonego na pole tekstowe (a nie jak poprzednicy chcieli szukac or`ami na roznych tabelach). zapewne skonczy sie to na full table scan, ale bedzie to tylko jedna tabela, ktora mysql moze upcha w pamieci operacyjnej.

do tego pomijasz sprawe laczenia tabel inner joinem, unikasz stosowania roznych indeksow (rozne pliki). masz tylko jeden index, o ktorym pamietasz, i tylko jeden, ktory moze sie rozrasnac/zdefragmentowac.
mozna zastosowac widoki/zapytania z union itd do uzyskania celu, jaki chcesz, ale to wszystko bedzie wieksza proteza, tego, co zaproponowalem (no moze poza slownikiem wspolnych slow, ale wtedy i tak pojda w ruch union`y, co nie sadze, zeby bylo szybsze)

aha w wyniku dostaniesz trojki id: branza, produkt, producent i czwarte id - unikalne dla tabeli laczacej - wtedy wyrzucaszy wynik po czwartej kolumnie, ktora znalazles poprzez stosowanie like na skonkatenowanej nazwie.
Ostatnio zmieniony 2007-09-07, 19:57 przez xil, łącznie zmieniany 3 razy.
ODPOWIEDZ