konto usunięte

Temat: Implementacja własnego full-text search?

Poszukuję tutoriali, a właściwie cennych podopowiedzi, jak zaimplementować tekstowe przeszukiwanie dokumentów w bazie.

Chodzi mi o własną implementację od podstaw, a googlanie niestety daje mi tylko gotowce jak FULLTEXT MyISAM, Lucene i ich odpowiedników.

Mnie interesuje napisanie własnego rozwiązania (bo tak :) z podejściem czysto SQLowym a'la
SELECT * FROM dokumenty JOIN dokumenty_słowa JOIN słowa...
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Implementacja własnego full-text search?

http://www.goldenline.pl/forum/bazy-danych/460188

konto usunięte

Temat: Implementacja własnego full-text search?

Tamten wątek niestety zakończył się na LIKE "%x%" :(
Marcin Lulek

Marcin Lulek Programista -
WebReactor

Temat: Implementacja własnego full-text search?

podpowiadam, zainstaluj sobie phpbb3 i spojrzyj, tam masz gotowe rozwiazanie ;-)
Patryk Szczygłowski

Patryk Szczygłowski Systems Engineer

Temat: Implementacja własnego full-text search?

Hey Pornel, z tego co pamiętam, to Google publikowało gdzieś trochę teorii wyszukiwania w jakimś dokumencie technicznym.

konto usunięte

Temat: Implementacja własnego full-text search?

Pamiętam, że depesz coś podobnego opisywał: http://www.depesz.com/index.php/2007/09/15/speeding-up.... Ogólnie - robi się tabelkę ze wszystkimi słowami i tabelkę realizującą relację wiele-do-wielu - w tym co ma być indeksowane.

konto usunięte

Temat: Implementacja własnego full-text search?

Gdyby to bylo takie proste jak podzielenie na słowa to w tamtym wątku nie sugerowałbym '%like%'.
Bo co z przypadkami:
"Don't be naive" - angielskie skróty
"Rock'n'roll"
"'89"
"2008/10/04"
"SQL98"
itd itp...

Temat: Implementacja własnego full-text search?

Piotr Likus:
Gdyby to bylo takie proste jak podzielenie na słowa to w tamtym wątku nie sugerowałbym '%like%'.
Bo co z przypadkami:
"Don't be naive" - angielskie skróty
"Rock'n'roll"
"'89"
"2008/10/04"
"SQL98"
itd itp...

No i...?
Twierdzisz, że wbudowane full-text-searche obsługują rozpoznawanie skrótów?

konto usunięte

Temat: Implementacja własnego full-text search?

Wojciech Małota:
No i...?
Twierdzisz, że wbudowane full-text-searche obsługują rozpoznawanie skrótów?

Śmiem tak twierdzić...
http://mira.sai.msu.su/~megera/pgsql/ftsdoc/fts-parser...

konto usunięte

Temat: Implementacja własnego full-text search?

Jeżeli chodzi o ścisłość - jak słownik, uwzględnia skróty to rozwiązanie też je będzie uwzględniać. Co do zasady nic się nie zmienia. To co robi fts to jest zwykła analiza słownikowa a nie przetwarzanie języka naturalnego. A skoro tak to jest kwestia doboru słownika, bo i tak kontekst nie jest analizowany w takich rozwiązaniach.
Jeżeli chodzi o FTS w Postgresie - tu jest link do dokumentacji:
http://www.postgresql.org/docs/8.3/static/textsearch.html
Nieco niżej w googlach, ale za to strona się szybciej otwiera.

Temat: Implementacja własnego full-text search?

moduł Oracle Text proponowałbym uwzględnić.
Krzysztof T.

Krzysztof T. Software maker

Temat: Implementacja własnego full-text search?

Dużo zalezy od tego jak przetrzymywane są dane.
Jakiś czas temu miałem przyjemność dziergać rozwiązanie przeszukujące dokumenty po występowaniu słów wypluwając wynik (znalezione dokumety) posortowany gęstością występowania tychże kluczy.
Treść dokumentów była przetrzymywana w CLOBach, zaś samo przeszukiwanie to silnie złożone zapytanie SQL na UNION-ach. Oczywyście zapytanie było fabrykowane dynamicznie w zalezności od ilości kluczy i interesujacego porządku sortowania.

Reasumując - działanie było identyczne do mechanizmów znanych z MediaWiki, czyli przeszukiwanie wyłacznie biezących wersji dokumentów z jednoczesnym ignorowaniem tytułów dokumentów (przeszukiwano tylko treść).
Krzysztof T.

Krzysztof T. Software maker

Temat: Implementacja własnego full-text search?

Michał Z.:
Pamiętam, że depesz coś podobnego opisywał: http://www.depesz.com/index.php/2007/09/15/speeding-up.... Ogólnie - robi się tabelkę ze wszystkimi słowami i tabelkę realizującą relację wiele-do-wielu - w tym co ma być indeksowane.

Niestety, przy wiązaniu słownika z dokumentami (M2M) baza puchła by niemiłosiernie, a i czasy przetwarzania też były by nie do zaakceptowania (każdy ruch w dokumencie wymagał by aktualizacji powiązań), dlatego to wyjście uznałem za nieodpowiednie (klient zlinchował by mnie za wydajność).
Przeszukiwanie dokumentów - jakie by nie było - swój koszt mieć będzie, byle był to koszt w granicach rozsądku i jedynie w fazie wyszukiwania. M2M wymaga jednak bieżących aktualizacji - czyli kosztuje wszędzie, zatem odradzam.

konto usunięte

Temat: Implementacja własnego full-text search?

Krzysztof Torenc:
Michał Z.:
Pamiętam, że depesz coś podobnego opisywał: http://www.depesz.com/index.php/2007/09/15/speeding-up.... Ogólnie - robi się tabelkę ze wszystkimi słowami i tabelkę realizującą relację wiele-do-wielu - w tym co ma być indeksowane.

Niestety, przy wiązaniu słownika z dokumentami (M2M) baza puchła by niemiłosiernie, a i czasy przetwarzania też były by nie do zaakceptowania (każdy ruch w dokumencie wymagał by aktualizacji powiązań), dlatego to wyjście uznałem za nieodpowiednie (klient zlinchował by mnie za wydajność).
Przeszukiwanie dokumentów - jakie by nie było - swój koszt mieć będzie, byle był to koszt w granicach rozsądku i jedynie w fazie wyszukiwania. M2M wymaga jednak bieżących aktualizacji - czyli kosztuje wszędzie, zatem odradzam.

Odniosłem się do problemu, który przedstawił pytający. Z pytania wynikało, że chodzi o proste rozwiązanie, od którego można zacząć. Takie podałem. To po pierwsze.

Druga sprawa - pytający wspomina o MyISAM - skoro tak to wydaje mi się, że składane zapytanie z wieloma unionami raczej nie jest dobrym pomysłem. Mówiąc inaczej - coś co działa na Oracle'u - wcale nie musi działać gdzie indziej. Wypadałoby przynajmniej podać, że rozwiązanie działało / działa na takiej, czy innej bazie - bo wcale nie wiem, czy dobrze zgaduję...

Po trzecie - pełnoprawne rozwiązanie FTS wykorzystuje indeksy GIS. Po co cała ta gimnastyka, skoro może to zrobić baza danych? Oczywiście - szybciej? PostgreSQL ma takie coś: http://www.postgresql.org/docs/current/static/tsearch2... Specjalnie nie podawałem tego linka. Jak ktoś ma problem ze znalezieniem tutoriala, może mieć problem z przebrnięciem przez PG, i skonfigurowaniem tsearcha.
Krzysztof T.

Krzysztof T. Software maker

Temat: Implementacja własnego full-text search?

Michał Z.:
[...ciach...]

Druga sprawa - pytający wspomina o MyISAM - skoro tak to wydaje mi się, że składane zapytanie z wieloma unionami raczej nie jest dobrym pomysłem. Mówiąc inaczej - coś co działa na Oracle'u - wcale nie musi działać gdzie indziej.
Prawda, nie musi - nikt nie twierdzi że jest inaczej.
PS. Na postgre UNION-y są, więc choć nie sprawdzałem to idę o zakład że działają ;)))))
W drugą stranę na oraclu nie ma np. ilike, ale co to zmienia ?
Można rzecz skroić SQLem na kilka sposobów - ja zrobiłem to na uniach, gdyz takie wyjście wydawało mi się najwygodniejsze.

Pytajacy prosił o wskazówki, realizowałem temat zatem dostarczyłem wskazówkę :)
Po trzecie - pełnoprawne rozwiązanie FTS wykorzystuje indeksy GIS. Po co cała ta gimnastyka, skoro może to zrobić baza danych? Oczywiście - szybciej? PostgreSQL ma takie coś: http://www.postgresql.org/docs/current/static/tsearch2... Specjalnie nie podawałem tego linka. Jak ktoś ma problem ze znalezieniem tutoriala, może mieć problem z przebrnięciem przez PG, i skonfigurowaniem tsearcha.

cuż, mógł bym odpowiedzieć koledze w ten sam sposób: to, że cos jest na Postgre to nie znaczy ze np. MySQL czy cokolwiek innego również to ma :))))

a po co cała ta gimnastyka ? w poscie pytajacego stoi: "... Mnie interesuje napisanie własnego rozwiązania (bo tak :) z podejściem czysto SQLowym ..."
A pozatym to fajne jest :)Krzysztof Torenc edytował(a) ten post dnia 01.06.09 o godzinie 19:39

konto usunięte

Temat: Implementacja własnego full-text search?

Krzysztof Torenc:
[...]
Prawda, nie musi - nikt nie twierdzi że jest inaczej.
PS. Na postgre UNION-y są, więc choć nie sprzadzałem to idę o zakład że działają ;)))))
>
No właśnie SQL to taki "standard", że każda baza różnie rozumie takie rzeczy. W przypadku union - pokaże duplikaty, czy nie? Szybkość, indeksy...
W drugą stranę na oraclu nie ma np. ilike, ale co to zmienia ?
Można rzecz skroić SQLem na kilka sposobów - ja zrobiłęm to na uniach, gdyz takie wyjście wydawało mi się najwygodniejsze.
Podaję rozwiązanie + przykłady jakie znam. Czyli jednak zgadłem z tym Oraclem. :)
Pytajacy prosił o wskazówki, realizowałem temat zatem dostarczyłem wskazówkę :)
No, jak bym nie wiedział o co chodzi... pewnie bym się nie zorientował, ale nic to, pewnie pytający i tak tego nie przeczyta.
Po trzecie - pełnoprawne rozwiązanie FTS wykorzystuje indeksy GIS. Po co cała ta gimnastyka, skoro może to zrobić baza danych? Oczywiście - szybciej? PostgreSQL ma takie coś: http://www.postgresql.org/docs/current/static/tsearch2... Specjalnie nie podawałem tego linka. Jak ktoś ma problem ze znalezieniem tutoriala, może mieć problem z przebrnięciem przez PG, i skonfigurowaniem tsearcha.

cóż, mógł bym odpowiedzieć koledze w ten sam sposób: to, że cos jest na Postgre to nie znaczy ze np. MySQL czy cokolwiek innego również to ma :))))
Tyle, że dokładnie podaję gdzie działa a nie wspomnę, że ilike i każdy ma się domyślić, co miałem na myśli. Niby szczegół, ale jak ktoś nie siedzi w temacie... a przecież pisze się po to, żeby pomóc. Ja rozumiem, moja baza - mój świat. Ostatnio tak na IRCu komuś radziłem i ktoś inny mnie naprostował. Jako, że mam optykę poprawioną to mnie kole... :)))
a po co cała ta gimnastyka ? w poscie pytajacego stoi: "... Mnie interesuje napisanie własnego rozwiązania (bo tak :) z podejściem czysto SQLowym ..."
A poza tym to fajne jest :)

Jak by nie miało tak być - to bym polecił wyszukiwanie pełnotekstowe jakie MySQL ma w standardzie. Badziewne strasznie, ale ma parę zalet. Pierwsza jest taka, że jest. Druga to to, że łatwo się uruchamia. A w działaniu... Jak ktoś używa Allegro - mówię o oznaczeniach produktów np. "F-16" można zapisać na kilka sposobów. Jak się nie poda dokładnego "słowa" to baza nie znajdzie. A do analizy leksykalnej jeszcze dość daleko. Chociaż w tym przypadku spell-check powinien sobie poradzić bez problemu. Indeksowany tekst można sprowadzić do postaci kanonicznej - każdy wyraz, osobno. Przy szukaniu wystarczy tak zrobić tylko z wyrazem szukanym. Teoretycznie... W praktyce sprawa jest mocno niebanalna. Bo przecież ten spell-checker nie poradzi sobie ze zwrotami "F16", "F-16", "F - 16" - w taki sam sposób. O! i w tym miejscu zaczynają się ciekawe rzeczy :D

I tym optymistycznym akcentem chciałbym nieśmiało zaproponować zakończenie... :) A w każdym razie przeniesienie dyskusji na priv.

konto usunięte

Temat: Implementacja własnego full-text search?

tutaj: http://www.sqlservercentral.com/articles/Full-Text+Sea...
jest przykład próby pod VB.NET i SQL Server...

pozdr.Michał Kowalczyk edytował(a) ten post dnia 14.04.09 o godzinie 17:24

konto usunięte

Temat: Implementacja własnego full-text search?

W końcu to zaimplementowałem.

Mam mniejwięcej taki układ tabel:

artykuły (id, pagerank)
słowa_artykuły (artykuł_id, słowo_id, trafność)
słowa(id, słowo)

i wyszukuję joinując to wszystko razem mniejwięcej tak:

select sum(trafność)*pagerank ... where słowo in (...)


Nie używam dosłownie słów, tylko generuję z dokumentu masę słowo-podobnych symboli, m.in. dorzucam "słowa" wygenerowane stemmerem oraz pary sąsiednich słów, co pomaga mi wyszukiwać frazy (a b c d += ^a, ab, bc, cd, d$).

Pod postgresem to jest wystarczjąco szybkie i całkiem trafne przy przeszukiwaniu 10000 dokumentów.

Wyliczanie trafności/związku (relevance) słowa z dokumentem to ciężka sprawa. Użyłem proporcji między częstotliwością występowania słowa w danym dokumencie vs średniej częstotliwości w całej bazie, co automatycznie zneutralizowało wszystkie "stopwordy".

Następna dyskusja:

Sphinx Full-Text Search Eng...




Wyślij zaproszenie do