全文検索が必要なRailsアプリをHerokuにデプロイする準備をしています。これまで、MySQLとSphinxを使用してVPSで実行してきました。
ただし、HerokuでSphinxまたはSolrを使用する場合は、アドオンの料金を支払う必要があります。
PostgreSQL(Herokuで使用されるDB)には全文検索機能が組み込まれていることに気付きました。
Postgresの全文検索を使用できなかった理由はありますか?Sphinxより遅いですか、それとも他の大きな制限がありますか?
全文検索が必要なRailsアプリをHerokuにデプロイする準備をしています。これまで、MySQLとSphinxを使用してVPSで実行してきました。
ただし、HerokuでSphinxまたはSolrを使用する場合は、アドオンの料金を支払う必要があります。
PostgreSQL(Herokuで使用されるDB)には全文検索機能が組み込まれていることに気付きました。
Postgresの全文検索を使用できなかった理由はありますか?Sphinxより遅いですか、それとも他の大きな制限がありますか?
PostgresとLuceneに興味があるなら、両方ではないのはなぜですか?ファーストクラスのインデックスタイプとしてElasticsearchを統合するPostgresのZomboDB拡張機能を確認してください。まだかなり初期のプロジェクトですが、私には本当に有望に見えます。
(技術的にはHerokuでは利用できませんが、それでも一見の価値があります。)
開示:私はWebsolrとBonsai Herokuアドオンの共同創設者なので、私の見方はLuceneに少し偏っています。
Postgresの全文検索について読んだところ、単純なユースケースではかなり堅実ですが、Lucene(したがってSolrとElasticSearch)がパフォーマンスと機能の両方の点で優れている理由はいくつかあります。
手始めに、jpountzは、 「SolrがPostgresよりもはるかに高速なのはなぜですか?」という質問に対する真に優れた技術的回答を提供します。本当に消化するために、2、3回読む価値があります。
また、Postgres全文検索とSolrの相対的な長所と短所を比較した最近のRailsCastエピソードについてもコメントしました。ここで要約します。
LIKE
演算子よりもはるかに優れています。頭のてっぺんから、順不同で…</ p>
明らかに、Luceneに基づく専用の検索エンジンがここでのより良いオプションだと思います。基本的に、Luceneは検索の専門知識の事実上のオープンソースリポジトリと考えることができます。
しかし、他の唯一のオプションがLIKE
演算子である場合、Postgres全文検索は間違いなく勝利です。
Elastic Search(1.9)をpostgres FTSと比較する作業を行ったばかりなので、結果は@gustavodiazjaimesが引用しているものよりもいくらか最新のものであるため、結果を共有する必要があると考えました。
postgresに関する私の主な懸念は、ファセットが組み込まれていないことでしたが、それは自分自身を構築するのは簡単です。これが私の例です(djangoで):
results = YourModel.objects.filter(vector_search=query)
facets = (results
.values('book')
.annotate(total=Count('book'))
.order_by('book'))
私はpostgres9.6とelastic-search1.9を使用しています(djangoのhaystackを介して)。これは、16のさまざまなタイプのクエリにわたるelasticsearchとpostgresの比較です。
es_times pg_times es_times_faceted pg_times_faceted
0 0.065972 0.000543 0.015538 0.037876
1 0.000292 0.000233 0.005865 0.007130
2 0.000257 0.000229 0.005203 0.002168
3 0.000247 0.000161 0.003052 0.001299
4 0.000276 0.000150 0.002647 0.001167
5 0.000245 0.000151 0.005098 0.001512
6 0.000251 0.000155 0.005317 0.002550
7 0.000331 0.000163 0.005635 0.002202
8 0.000268 0.000168 0.006469 0.002408
9 0.000290 0.000236 0.006167 0.002398
10 0.000364 0.000224 0.005755 0.001846
11 0.000264 0.000182 0.005153 0.001667
12 0.000287 0.000153 0.010218 0.001769
13 0.000264 0.000231 0.005309 0.001586
14 0.000257 0.000195 0.004813 0.001562
15 0.000248 0.000174 0.032146 0.002246
count mean std min 25% 50% 75% max
es_times 16.0 0.004382 0.016424 0.000245 0.000255 0.000266 0.000291 0.065972
pg_times 16.0 0.000209 0.000095 0.000150 0.000160 0.000178 0.000229 0.000543
es_times_faceted 16.0 0.007774 0.007150 0.002647 0.005139 0.005476 0.006242 0.032146
pg_times_faceted 16.0 0.004462 0.009015 0.001167 0.001580 0.002007 0.002400 0.037876
ファセット検索でこれらの速度に後戻りするために、SearchVectorFieldを使用してフィールドでGINインデックスを使用する必要がありました。これは、django固有ですが、他のフレームワークにも同様のベクトルタイプがあると確信しています。
もう1つの考慮事項は、9.6ページでフレーズマッチングがサポートされるようになったことです。これは非常に大きな問題です。
私の持ち帰りは、postgresはほとんどの場合それが提供するので好ましいだろうということです:
私はこの驚くべき比較を見つけ、それを共有したいと思います:
インデックスLIKE述語を構築する時間-なし
PostgreSQL/GIN-40分
Sphinx検索-6分
ApacheLucene-9分
転置インデックス-高
インデックスストレージLIKE述語-なし
PostgreSQL/GIN-532MB
スフィンクス検索
-533MBApacheLucene-1071MB
転置インデックス-101MB
クエリ速度LIKE述語-90秒以上
PostgreSQL/GIN-20ミリ秒
Sphinx検索-8ミリ秒
ApacheLucene-80ミリ秒
転置インデックス-40ミリ秒
Postgresの全文検索は、ステミング、ランキング/ブースト、同義語処理、あいまい検索などの分野で驚くべき機能を備えていますが、ファセット検索はサポートされていません。
したがって、Postgresがすでにスタックにあり、ファセットが必要ない場合は、Luceneベースのソリューションを探す前に、インデックスの同期と洗練されたスタックの維持が容易であるという大きなメリットを活用してみてください。アプリは検索に基づいていません。
PostgresqlのFTS関数は成熟しており、ルックアップでかなり高速です。確かに一見の価値があります。