предложите как 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).