2012-10-25 19 views
15

Próbuję uruchomić zapytanie pełnotekstowe przy użyciu PostgreSQL, które może obsłużyć częściowe dopasowania przy użyciu symboli wieloznacznych.Dziurkacz z prefiksem Postgresql do pełnego tekstu

Po wyszukującym hasło wydaje się dość łatwe, aby mieć postfiks wieloznaczny, jednak nie mogę określić, jak określić przedrostek wieloznaczny.

Na przykład, mogę przeprowadzić wyszukiwanie postfix dość łatwo przy użyciu coś jak ..

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*')) 

powinien zwrócić pasujące wyniki „London”

Jednak nie mogę wydawać się zrobić wyszukiwania prefiks jak .. .

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don')) 

Idealnie chciałabym mieć wieloznaczny prefiksem do przodu i koniec szukanej, coś jak ...

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*')) 

Mogę używać warunku JAK jednak miałem nadzieję skorzystać z wydajności funkcji wyszukiwania pełnotekstowego w Postgresie.

+2

Według instrukcji: http://www.postgresql.org/docs/current/static/textsearch-controls.html don ': *' ** to ** * przedrostek * * wyszukiwanie. Czy możliwe jest mieszanie wyszukiwania prefiksów i postfiksów? –

Odpowiedz

9

Wyszukiwanie pełnotekstowe jest dobre do wyszukiwania słów, a nie podciągów.

Dla podciągu przeszukuje lepiej wykorzystywać like '%don%' z pg_trgm rozszerzenia dostępnego z PostgreSQL 9.1 i using gin (column_name gin_trgm_ops) lub using gist (column_name gist_trgm_ops) indeksów. Ale twój indeks byłby bardzo duży (nawet kilkakrotnie większy niż twój stół), a wydajność pisania nie byłaby zbyt dobra.

Istnieje very good example of using pg_trgm for substring search na select * from depesz blog.

+0

Dzięki za odpowiedź, wdrożyliśmy coś podobnego już pod względem zapytania, więc z dodatkiem trygramów mam nadzieję, że powinno to dać nam oczekiwany wzrost wydajności. Dzięki jeszcze raz. –

+0

jak zrobić, używając gist (column_name gist_trgm_ops) na 2 kolumnach zamiast jednego? –

6

Jednym z dzikich i szalonych sposobów na to byłoby stworzenie indeksu tsvector wszystkich dokumentów, odwrócony. I odwróć swoje zapytania również w poszukiwaniu postfixów.

Jest to w zasadzie to, co robi z jego Solr ReversedWildcardFilterFactory

select 
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true 
+2

Praktyczne czy nie, to zła fajna sztuczka. – Medorator

+1

Niestety, jeśli zapytasz 'wiersz' zamiast' rown', to nie zwróci wyników. Powodem jest to, że będzie sprawdzać od końca do początku, ale znowu tylko od pierwszej (ostatniej w tej sytuacji) litery, a nigdy od środka. –

+0

@BernardPotocki nie w specyfikacji;) Wyszukiwanie pełnotekstowe jest wystarczająco trudne bez podciągów. Jeśli chcesz wyszukać 'row' i dopasować' brown', to jest to dobry przypadek użycia dla wyrażeń regularnych –