Maciej G.

Maciej G. Programista
PHP/JavaScript/Flex
Webdeveloper HTML,
CSS

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Witam.
Mam taki problemik. Klient zażyczył sobie, aby wyniki zwrócone podczas wyszukiwania danych były uszeregowane wg tych najbardziej trafnych. Wyszukiwanie odbywa się za pomocą Select.... Where `columna` like '%jakas_wartosc%' i często zdarza się, że szukane wyrażenie znajduje się gdzieś pośrodku zwróconych wyników. Wykorzystuję BD MySQL. Czy da się to zrobić bez wykorzystania zewnętrznych narzędzi (podobno Sphinx ma coś takiego)?

konto usunięte

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search...
http://www.shodan.ru/projects/sphinx/#features

polecam lekture :)
Maciej G.

Maciej G. Programista
PHP/JavaScript/Flex
Webdeveloper HTML,
CSS

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Heh. Korzystałem z tego wcześniej, ale jakoś nie skojarzyłem, że jest aż tak pożyteczne. Dzięki za pomoc.
Ze Sphinxa raczej nie skorzystam bo danych jest niewiele.
Pozdrawiam.

konto usunięte

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

dosc wazna rzecz - ale pewnie wiecie :)

""Full-text indexes can be used only with MyISAM tables,... ""

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

""Full-text indexes can be used only with MyISAM tables,... ""

I to niestety wyklucza możliwość zastosowania tego rozwiązania w wielu projektach. Wydaje mi się, że MyISAM się już raczej nie używa chyba, że ktoś dopiero zaczyna zabawę z MySQL i nie wie, że są inne systemy składowania danych.

Co do wypowiedzi pierwszej to tylko powiem, że używanie

Select.... Where `columna` like '%jakas_wartosc%'

może być strzałem w kolano.
Nie będę ukrywał, że w tej chwili robię dokładnie tak samo bo mam do czynienia z małymi DB :-) Przy większych bazach przy czymś takim serwer umrze.
Sytuację może poprawić wycięcie pierwszego '%' do postaci

Select.... Where `columna` like 'jakas_wartosc%'

wtedy przynajmniej silnik użyje (a przynajmniej powinien użyć) indeksu. jednak domyślam się, że przeszukiwane są kolumny typu TEXT więc indeksu na nich nie założysz.

Generalnie zgodnie ze sztuką powinno to się robić tak, że masz tabelę z tekstami i tabelę będącą indeksem słów występującymi w tekstach. Potem tworzysz trzecią tabelę, która służy do zrobienia relacji n do n opisującej, które słowa występują w jakich tekstach. W tej tabeli możesz też zawrzeć wartości wagowe.
Czyli np. jeśli słowo występuje w tytule to dajesz wagę 3, jeśli słowo występuje w pierwszych 1000 znaków tekstu to dajesz wagę 2, jeśli gdzie indziej to 1.
Wtedy wyszukując teksty, które zawierają dane słowo i sumując wagi możesz posortować wyniki według trafności (sumy wag).

konto usunięte

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Wojciech Małota:
[ciach]
możesz też zawrzeć wartości wagowe.
Czyli np. jeśli słowo występuje w tytule to dajesz wagę 3, jeśli słowo występuje w pierwszych 1000 znaków tekstu to dajesz wagę 2, jeśli gdzie indziej to 1.
Wtedy wyszukując teksty, które zawierają dane słowo i sumując wagi możesz posortować wyniki według trafności (sumy wag).
Jeśli mowa o systemie wagowym, to być może dobrze byłoby użyć wagi co 1000 - przewidywana maksymalna ilość wystąpień tego słowa w tekście.
Tak więc dla słów występujących w tytule dajemy wagę 1 000 000, dla pierwszych 1000 znaków - waga 1 000, dla pozostałych - waga 1. Wtedy łatwo sprawdzić, do którego przedziału wartości należy indeks i określić dokładnie ilość wystąpień w poszczególnych polach. W każdym razie daje to większe pole manewru, niż tylko sumowanie.
Jest to stary sposób numerowania pokoi hotelowych - 1005 - 5. pokój na 10. piętrze. Pierwsze dwie cyfry - numer piętra.
[edit]Wojciech Błoński edytował(a) ten post dnia 11.07.08 o godzinie 10:40

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Wojciech Błoński:
/..ciach../

No nie do końca. Ponieważ jeżeli słowo wystąpi raz w tytule z wagą 10 000,a w innym tekście 5 razy w pierwszych 1000 znakach to drugi tekst będzie dalej w rankingu bo 1 * 10 000 > 5 * 1000 co niekoniecznie jest zgodne z naszymi oczekiwaniami.
W moim opisie chodziło o to aby ranking ustalać za pomocą najzwyklejszej operacji sumy, która jest najszybszą możliwą operacją do wykonania na prockach.

konto usunięte

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Właśnie o to chodzi, aby mieć jednak możliwość odróżnić sytuację, gdy słowo wystąpiło raz w tytule, od takiej, gdy wystąpiło 3 razy w dalekim tekście. Bo w ogólnym przypadku to nie to samo.
Pozdrawiam

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Wojciech Błoński:
Właśnie o to chodzi, aby mieć jednak możliwość odróżnić sytuację, gdy słowo wystąpiło raz w tytule, od takiej, gdy wystąpiło 3 razy w dalekim tekście. Bo w ogólnym przypadku to nie to samo.

No ale jednak chcemy aby jakaś ilość wystąpień w tekście potrafiła przebić jedno wystąpienie w tytule.
Dlatego możemy sobie ustalić wagi dowolnie.
Ktoś stwierdzi, że waga wystąpienia w tytule będzie 6, a w tekście 2, a ktoś inny, że w tytule będzie 10, a w tekście 5.
Wszystko jest kwestią tego co dla kogo będzie miało jaki priorytet.

konto usunięte

Temat: Sortowanie wyników wyszukiwania danych wg ich trafności...

Hmm, bardzo pouczająca dyskusja, przynajmniej dla mnie.
Dzięki.

Następna dyskusja:

Forum Bazy Danych




Wyślij zaproszenie do