предложите как google с триграммами postgresql и полнотекстовым поиском

Я хочу сделать текстовый поиск, как предложения google.

Я использую PostgreSQL из-за магического С PostGIS.

Я думал об использовании FTS, но я видел, что он не может искать частичные слова, Так что я нашел этот вопрос и видел как триграмм строительство.

главная проблема заключается в том, что поисковая система я работаю на на испанский язык. FTS отлично поработала со stemming и словари (синонимы, опечатки), UTF и так далее. Триграммы отлично работали для частичных слов, но они работают только для ASCII, и (очевидно) они не используют такие вещи, как словари.

Я думал, есть ли способ, которым можно использовать лучшие вещи из обоих.

можно ли сделать полнотекстовый поиск и триграммы для совместной работы в PGSQL?

2 ответов


вы можете сделать это в Postgres, и не нужно Lucene.

вы можете цитировать фразы tsquery или tsvector Как ниже. Вы можете добавить :* после tsquery термин для поиска префикса:

select
'''new york city'''::tsvector   @@ '''new yo'':*'::tsquery, --true
'''new york times'''::tsvector  @@ '''new yo'':*'::tsquery, --true
'''new york'''::tsvector        @@ '''new yo'':*'::tsquery, --true
'''new'''::tsvector             @@ '''new yo'':*'::tsquery, --false
'new'::tsvector                 @@ '''new yo'':*'::tsquery, --false
'new york'::tsvector            @@ '''new yo'':*'::tsquery  --false

основная проблема в том, что to_tsvector() и [plain]to_tsquery() будет лишить ваши цитаты. Вы можете написать свои собственные версии, которые этого не делают (это не так сложно), или сделать некоторую пост-обработку после них, чтобы построить свой термин n-граммы.

дополнительные одинарные кавычки выше просто убегает. select $$ i heart 'new york city' $$::tsvector; эквивалентны.


Я бы рекомендовал взглянуть на введение. Он может быть интегрирован изначально в Java, легко в .NET или с помощью SOLR и веб-служб в php.

Он имеет большие возможности для свободного текстового поиска, ранжирования терминов из коробки, поддержки разных языков с использованием разных анализаторы (ссылка на испанский).

последнее, но не менее важное, это также очень быстро (для больших объемов, скажем, индекс 4Gb ~ 5 000 000 строк в БД, это намного быстрее чем БД Postgres).