2013-01-21 10 views
5

Wdrażam wyszukiwanie pełnotekstowe w postgres.Czy należy zapisać parametr tre_vevector w tej samej tabeli lub tabeli zewnętrznej?

Chciałbym przeszukać wszystkie posty w moim systemie. Indeks pełnotekstowy wpisów jest połączeniem tytułu i treści postu.

Mam dwa sposoby osiągnięcia tego celu:

  1. utworzyć kolumnę tsvector w tabeli posty, powodują aktualizację do niego.
  2. utwórz drugą tabelę (posts_search) z kolumną post_id i tsvector zawierającą dane indeksu.
  3. stworzyć prosty indeks gin ... (nie wchodzi w rachubę, bo mój prawdziwy problem świat potrzebuje danych z wielu tabel dla indeksu)

Co będzie działać lepiej, biorąc pod uwagę, że czasami trzeba filtrować w dół wyszukiwania przez inne atrybuty w tabeli (jak deleted_at is null i tak dalej).

Czy lepiej jest zachować kolumnę tsvector w tej samej tabeli co dane (efekt uboczny wybierz * teraz do dupy) lub osobną tabelę (efekt uboczny, wymagane sprzężenie, filtrowanie indeksu jest skomplikowane)?

Odpowiedz

6

W moich eksperymentach, typowy rozmiar kolumny tsvector to około 1% wielkości pola tekstowego, to tsvector zostało obliczone z użycia to_tsvector().

Mając to na uwadze, przechowywanie kolumny tsvector w innej tabeli powinno zapewnić korzyści związane z wydajnością. Na przykład, nawet jeśli nie używasz SELECT * (i nie powinieneś, naprawdę), każdy seqscan w oryginalnej pojedynczej tabeli będzie nadal musiał ładować strony zawierające oryginalny tekst. Jeśli oddzielisz pole tsvector na osobną tabelę, ładowanie strony będzie szybsze o 100x.

Innymi słowy, byłbym zwolennikiem drugiego rozwiązania odciążenia pola tsvector do oddzielnej tabeli. Lub, alternatywnie, rozładowywanie postów (tekst oryginalny) głębiej w hierarchii tabeli (ale myślę, że to prawie to samo).

Należy pamiętać, że aby wyszukiwanie pełnotekstowe zadziałało, oryginalny tekst nie jest konieczny. Chcemy nawet nie przechowywać go w bazie danych lub przechowywać go w wysoce skompresowanym formacie (i niekoniecznie łatwo dostępny przez procedury SQL). Będzie działać tak długo, jak coś może tworzyć tsvector na podstawie oryginalnego tekstu lub aktualizować po zmianie.

+0

niewielkim problemem jest ponowne wykorzystanie indeksu, nie jestem pewien, jak wyrafinowany jest planista, zastanawiam się, czy to możliwe –

Powiązane problemy