2012-05-16 11 views
7

google suggestionsのようなテキスト検索を行いたいと思います。は、postgresql trigramsと全文検索でgoogleのように提案します

PostgreSQL私はPostgisという魔法のために使用しています。

私はFTSを使用して考えていたが、私はそれがpartial wordsを検索することができなかったことを見たので、私はthis questionを発見し、そしてどのようにtrigrams作品を見ました。

主な問題は、私が取り組んでいる検索エンジンがスペイン語であることです。 FTSはステミングや、dictionaries(シノニム、スペルミス)、UTFなどでうまくいきました。 Trigramsは部分的な単語にはうまくいきましたが、ASCIIの場合にのみ機能し、(明らかに)辞書のようなものは使用しません。

私は、両方から最高のものを使うことができる方法があれば、私は考えていました。

フルテキスト検索とTrigramsをPGSQLで連携させることはできますか?

答えて

3

これはPostgresで行うことができ、Luceneは必要ありません。

tsqueryまたはtsvectorのフレーズを以下のように引用できます。主な問題はto_tsvector()[plain]to_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 

:あなたは、前方一致検索を行うにはtsquery用語後:*を追加することができます。これをしない独自のバージョンを書くことができます(それほど難しいことではありません)。あるいは、後にn-gramの用語を作成するための後処理を行います。

上記の余分な一重引用符は単なるエスケープです。 select $$ i heart 'new york city' $$::tsvector;は同等です。

+0

うわー!この三重引用符に関する文書への参照を追加してください。 – jperelli

+1

トリプルクォートは実際には通常のSQLですが、別のもので一重引用符をエスケープしています。ドキュメントはここでそれを言います:http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

Luceneをご覧になることをお勧めします。これは、Javaでネイティブに、.NETで簡単に、またはPHPでSOLRとWebサービスを使用して統合することができます。

フリーテキスト検索、すぐに使用できる用語ランク付け、異なるAnalysers(スペイン語の場合はリンク)を使用する異なる言語のサポートのための優れた機能を備えています。

最後に、非常に高速です(大量の場合、4Gbインデックス〜DBの5 000 000行は、Postgresデータベースよりもはるかに高速です)。

+3

私はelasticsearchを使用して同様の解決策を検討しますが、質問に答えないので受け入れられません。ありがとう! – jperelli

関連する問題