326

Django サイトを構築していて、検索エンジンを探しています。

いくつかの候補:

  • Lucene/Lucene with Compass/Solr

  • スフィンクス

  • Postgresql 組み込み全文検索

  • MySQl 組み込み全文検索

選択基準:

  • 結果の関連性とランキング
  • 検索とインデックス作成の速度
  • 使いやすさと Django との統合のしやすさ
  • リソース要件 - サイトはVPSでホストされるため、理想的には検索エンジンは大量の RAM と CPU を必要としません。
  • スケーラビリティ
  • 「もしかして?」、関連検索などの追加機能

上記の検索エンジン、またはリストにない他のエンジンを使用した経験のある方なら誰でも、ご意見をお待ちしております。

編集: インデックス作成のニーズについては、ユーザーがサイトにデータを入力し続けると、それらのデータを継続的にインデックス作成する必要があります。リアルタイムである必要はありませんが、新しいデータが 15 ~ 30 分以内の遅延でインデックスに表示されることが理想的です

4

9 に答える 9

172

誰かが Lucene について意見を出しているのを見るのは良いことです。

一方、スフィンクスはよく知っているので、何かお役に立てないでしょうか。

  • 結果の関連性ランキングがデフォルトです。必要に応じて独自の並べ替えを設定し、特定のフィールドにより高い重みを付けることができます。
  • データベースと直接やり取りするため、インデックス作成速度は非常に高速です。複雑な SQL クエリやインデックスが作成されていない外部キーなどの問題が原因で、速度が遅くなります。検索の遅さに気づいたこともありません。
  • 私は Rails 派なので、Django での実装がどれほど簡単かはわかりません。ただし、Sphinx ソースに付属する Python API があります。
  • 検索サービス デーモン (searchd) のメモリ使用量はかなり少なく、インデクサー プロセスが使用するメモリ量にも制限を設定できます
  • スケーラビリティについては、私の知識がより大雑把ですが、インデックス ファイルを複数のマシンにコピーし、いくつかの searchd デーモンを実行するのは簡単です。ただし、他の人から得た一般的な印象は、高負荷下ではかなり優れているため、複数のマシンにスケールアウトすることは対処する必要がないということです.
  • 「did-you-mean」などはサポートされていませんが、これらは他のツールで簡単に実行できます。Sphinx は辞書を使用して単語をステミングするため、「運転」と「ドライブ」(たとえば) は検索では同じと見なされます。
  • ただし、Sphinx では、フィールド データの部分的なインデックスの更新は許可されていません。これに対する一般的なアプローチは、最近のすべての変更でデルタ インデックスを維持し、変更のたびにこれを再インデックス化することです (そして、それらの新しい結果は 1 ~ 2 秒以内に表示されます)。データ量が少ないため、これには数秒かかる場合があります。ただし、メインのデータセットを定期的に再インデックスする必要があります (ただし、データの揮発性に応じて、毎日? 1 時間ごと?)。ただし、インデックス作成速度が速いため、これはすべて非常に簡単です。

これがあなたの状況にどの程度当てはまるかはわかりませんが、Evan Weaver はいくつかのベンチマークを実行して、いくつかの一般的な Rails 検索オプション (Sphinx、Ferret (Ruby の Lucene のポート)、Solr) を比較しました。役に立つかもしれませんね。

MySQL の全文検索の詳細については調べていませんが、スピードの点でも機能の点でも、Sphinx、Lucene、または Solr と競合しないことはわかっています。

于 2009-04-10T15:08:56.173 に答える
82

Sphinx はわかりませんが、Lucene とデータベースの全文検索に関しては、Lucene のパフォーマンスは比類のないものだと思います。Lucene インデックスを正しく設定していれば、検索する必要があるレコードの数に関係なく、ほぼすべての検索を 10 ミリ秒未満で実行できるはずです。

個人的には、プロジェクトに Lucene を統合するのは簡単ではないと思います。確かに、基本的な検索を実行できるように設定するのはそれほど難しくありませんが、最適なパフォーマンスで最大限に活用したい場合は、間違いなく Lucene に関する優れた本が必要です。

CPU と RAM の要件については、Lucene で検索を実行しても CPU に負荷がかかりすぎませんが、データのインデックス作成はそれほど頻繁ではありませんが (おそらく 1 日に 1 回か 2 回)、そうではありません。かなりのハードル。

すべての質問に答えられるわけではありませんが、要するに、検索するデータが多く、優れたパフォーマンスが必要な場合は、間違いなく Lucene が適していると思います。検索するデータがそれほど多くない場合は、データベースの全文検索を行うこともできます。私の本では、MySQL 全文検索の設定は間違いなく簡単です。

于 2009-04-10T11:12:37.690 に答える
64

アパッチソル


OPの質問に答えるのとは別に、簡単な紹介から詳細なインストール実装まで、 Apache Solrに関するいくつかの洞察を投げかけましょう。

簡単な紹介


上記の検索エンジン、またはリストにない他のエンジンを使用した経験のある方なら誰でも、ご意見をお待ちしております。

リアルタイムの問題を解決するためにSolrを使用しないでください。検索エンジンにとって、Solrはほとんどゲームであり、問​​題なく動作します。

Solrはトラフィックの多い Web アプリケーションで問題なく動作します (これには適していないことをどこかで読みましたが、その声明を裏付けています)。CPUではなくRAMを使用します。

  • 結果の関連性とランキング

ブーストは、結果を上位にランク付けするのに役立ちます。たとえば、フィールドfirstnameおよびlastnameで名前johnを検索しようとしており、 firstnameフィールドに関連性を持たせたい場合は、示されているようにfirstnameフィールドをブーストする必要があります。

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

ご覧のとおり、firstnameフィールドはスコア 2 でブーストされています。

SolrRelevancyの詳細

  • 検索とインデックス作成の速度

速度は信じられないほど速く、妥協はありません。Solrに移行した理由。

インデックス作成の速度に関しては、Solrはデータベース テーブルからのJOINSも処理できます。より高度で複雑なJOINは、インデックス作成の速度に影響します。ただし、膨大なRAM構成を使用すると、この状況に簡単に対処できます。

RAM が大きいほど、Solr のインデックス作成速度が速くなります。

  • 使いやすさと Django との統合のしやすさ

SolrDjangoを統合しようとしたことはありませんが、Haystackを使用すると実現できます。同じことに関する興味深い記事を見つけました。これはgithubです。

  • リソース要件 - サイトは VPS でホストされるため、理想的には検索エンジンは大量の RAM と CPU を必要としません。

Solrは RAM で繁殖するため、RAM が高い場合はSolrについて心配する必要はありません。

数十億のレコードがある場合、Solr のRAM 使用量は完全なインデックス作成で急上昇します。デルタ インポートを賢く利用して、この状況に対処することができます。説明したように、Solr はほぼリアルタイムのソリューションにすぎません

  • スケーラビリティ

Solrは非常にスケーラブルです。SolrCloudをご覧ください。それのいくつかの重要な機能。

  • シャード (またはシャーディングは、インデックスが大きくなりすぎた場合など、複数のマシンにインデックスを分散する概念です)
  • ロード バランシング ( Solrjが Solr クラウドで使用されている場合、Solrj はラウンド ロビン メカニズムを使用して自動的にロード バランシングを処理します)
  • 分散検索
  • 高可用性
  • 「もしかして?」、関連検索などの追加機能

上記のシナリオでは、 Solrに同梱されているSpellCheckComponentを使用できます。他にも多くの機能があります。SnowballPorterFilterFactoryは、 bookの代わりにbooksと入力すると、 bookに関連する結果が表示されるなど、レコードを取得するのに役立ちます。


この回答は、広くApache SolrMySQLに焦点を当てています。Django は対象外です。

あなたが LINUX 環境にいると仮定すると、この記事の先に進むことができます。(私のものはUbuntu 14.04バージョンでした)

詳細なインストール

入門

ここからApache Solrをダウンロードします。バージョンは4.8.1になります。新しいバージョンをダウンロードできます。これは安定しています。

アーカイブをダウンロードしたら、任意のフォルダーに解凍します。.. Downloadsまたは何でも..と言うと、次のようになりますDownloads/solr-4.8.1/

プロンプトで..ディレクトリ内を移動します

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

だから今あなたはここにいます..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Jetty アプリケーション サーバーを起動する

Jettysolr-4.8.1ディレクトリの examples フォルダー内で使用できるので、その中を移動して Jetty アプリケーション サーバーを起動します。

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

ここで、ターミナルを閉じず、最小化して脇に置いておきます。

(ヒント: start.jar の後に & を使用して、Jetty サーバーをバックグラウンドで実行します)

Apache Solrが正常に実行されるかどうかを確認するには、ブラウザーでこの URL にアクセスします。http://localhost:8983/solr

カスタム ポートで Jetty を実行する

デフォルトではポート 8983 で実行されます。ここで、またはjetty.xmlファイル内で直接ポートを変更できます。

java -Djetty.port=9091 -jar start.jar

Jコネクタをダウンロード

この JAR ファイルは、MySQLと JDBC の間のブリッジとして機能します。プラットフォームに依存しないバージョンをここからダウンロードしてください。

ダウンロード後、フォルダを解凍してコピーし、 libディレクトリmysql-connector-java-5.1.31-bin.jarに貼り付けます。

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Apache Solr にリンクする MySQL テーブルの作成

Solrを使用するには、検索するテーブルとデータが必要です。そのために、MySQLを使用してテーブルを作成し、いくつかのランダムな名前をプッシュします。その後、Solrを使用してMySQLに接続し、そのテーブルとそのエントリのインデックスを作成できます。

1.表の構造

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2.上記の表に入力します

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

コアの内部に入り、lib ディレクティブを追加する

1.ナビゲート

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.solrconfig.xmlの修正

これら 2 つのディレクティブをこのファイルに追加します。

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

ここで、 DIH (データ インポート ハンドラー)を追加します。

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.db-data-config.xml ファイルを作成する

ファイルが存在する場合は無視して、これらの行をそのファイルに追加します。最初の行からわかるように、MySQLデータベースの認証情報を提供する必要があります。データベース名、ユーザー名、およびパスワード。

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(ヒント:エンティティはいくつでも持つことができますが、id フィールドに注意してください。それらが同じ場合、インデックス作成はスキップされます。)

4.schema.xmlファイルを修正する

示されているように、これをschema.xmlに追加します。

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

実装

索引付け

これが本当の取引です。Solr クエリを利用するには、 MySQLからSolrへのデータのインデックス作成を行う必要があります。

ステップ 1: Solr 管理パネルに移動します。

ブラウザーで URL http://localhost:8983/solrにアクセスします。こんな感じで画面が開きます。

これはメインの Apache Solr 管理パネルです

マーカーが示すように、上記の構成のいずれかがエラーを引き起こしているかどうかを確認するには、[ログ] に移動します。

ステップ 2: ログを確認する

わかりましたので、ここに来ました。黄色のメッセージ (警告) がたくさんあります。赤でマークされたエラー メッセージがないことを確認します。以前の構成で、db-data-config.xmlに選択クエリを追加しました。たとえば、そのクエリにエラーがあった場合、ここに表示されます。

これは、Apache Solr エンジンのログ セクションです。

エラーはありません。準備万端です。図のようにリストからcollection1を選択し、 Dataimportを選択します。

ステップ 3: DIH (データ インポート ハンドラー)

DIH を使用して、 Solrインターフェイスから構成ファイルdb-data-config.xmlを介してSolrからMySQLに接続し、 Solrにインデックス付けされたデータベースから 10 個のレコードを取得します。

これを行うには、full-importを選択し、オプションCleanおよびCommitをチェックします。次に、図のように [実行] をクリックします。

または、このような直接の完全インポートクエリを使用することもできます。

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

データ インポート ハンドラ

Executeをクリックすると、Solrはレコードのインデックス作成を開始します。エラーがあった場合は、Indexing Failedと表示され、 Loggingセクションに戻って何が問題なのかを確認する必要があります。

この構成にエラーがなく、インデックス作成が正常に完了した場合、この通知が表示されます。

インデックス作成の成功

ステップ 4: Solr クエリの実行

これで、 Solrクエリを使用して、インデックスが作成されたデータをクエリできるようになりました。左側のクエリをクリックし、下部の実行ボタンを押します。

示されているように、索引付けされたレコードが表示されます。

すべてのレコードを一覧表示するための対応するSolrクエリは次のとおりです。

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

索引付けされたデータ

さて、10 のインデックス付きレコードがすべて表示されます。たとえば、 Jaで始まる名前のみが必要です。この場合、列 name をターゲットにする必要がありますsolr_name。したがって、クエリは次のようになります。

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Ja* で始まる JSON データ

それがSolrクエリの書き方です。詳細については、この美しい記事をご覧ください。

于 2015-01-19T10:49:34.130 に答える
60

Solr についてこれ以上の情報が投稿されていないことに驚いています。SolrはSphinxに非常に似ていますが、より高度な機能を備えています(私はSphinxを使用していないので、それについて読むだけです)。

以下のリンクの回答には、Solr にも適用される Sphinx に関するいくつかの詳細が記載されています。 全文検索エンジンの比較 - Lucene、Sphinx、Postgresql、MySQL?

Solr は、次の追加機能も提供します。

  1. レプリケーションをサポート
  2. 複数のコア (これらは、独自の構成と独自のインデックスを持つ個別のデータベースと考えてください)
  3. ブール検索
  4. キーワードの強調表示 (regex-fu があれば、アプリケーション コードでかなり簡単に実行できます。ただし、専用のツールを使用して、より適切な作業を行ってみませんか)
  5. XML または区切りファイルを使用してインデックスを更新する
  6. HTTP 経由で検索サーバーと通信します (Json、ネイティブ PHP/Ruby/Python を返すこともできます)
  7. PDF、Word 文書の索引付け
  8. 動的フィールド
  9. ファセット
  10. 集約フィールド
  11. ストップワード、同義語など
  12. もっとこのように...
  13. カスタム クエリを使用してデータベースから直接インデックスを作成する
  14. 自動提案
  15. キャッシュの自動ウォーミング
  16. 高速なインデックス作成 (MySQL 全文検索のインデックス作成時間と比較して) -- Lucene は、バイナリ逆インデックス形式を使用します。
  17. ブースティング (特定のキーワードやフレーズの関連性を高めるためのカスタム ルールなど)
  18. フィールド検索 (検索ユーザーが検索したいフィールドを知っている場合、フィールド、次に値を入力して検索を絞り込みます。すべてではなくそのフィールドのみが検索されます。ユーザー エクスペリエンスが大幅に向上します)

ところで、他にもたくさんの機能があります。ただし、本番環境で実際に使用した機能のみをリストしました。ところで、MySQL はすぐに、上記のリストの #1、#3、および #11 (限定的) をサポートします。探している機能については、リレーショナル データベースでは対応できません。私はそれらをすぐに排除します。

また、もう 1 つの利点は、Solr (実際には Lucene) がドキュメント データベース (NoSQL など) であるため、他のドキュメント データベースの多くの利点を Solr で実現できることです。つまり、検索以外にも使用できます (つまり、パフォーマンス)。創造性を発揮してください :)

于 2010-12-09T04:20:35.857 に答える
28

私は現在、PostgreSQL の全文検索を検討しています。最新の検索エンジンのすべての適切な機能、非常に優れた拡張文字と多言語サポート、データベース内のテキスト フィールドとの優れた緊密な統合を備えています。

しかし、+ や AND (& | ! を使用) などのユーザー フレンドリーな検索演算子はありません。結果のスニペットで一致用語が太字になっていますが、一致用語のデフォルトのアルゴリズムは優れていません。また、rtf、PDF、MS Office をインデックス化する場合は、ファイル形式コンバーターを見つけて統合する必要があります。

OTOH は、3 文字以下の単語のインデックスさえ作成しない MySQL のテキスト検索よりもはるかに優れています。これは MediaWiki 検索のデフォルトであり、エンドユーザーには良くないと思います: http://www.searchtools.com/analysis/mediawiki-search/

私が見たすべてのケースで、Lucene/Solr と Sphinx は本当に素晴らしいです。それらは堅固なコードであり、使いやすさが大幅に改善されて進化したため、ほぼすべての人を満足させる検索を行うためのツールがすべて揃っています。

for SHAILI - SOLR には Lucene 検索コード ライブラリが含まれており、優れたスタンドアロン検索エンジンとなるコンポーネントがあります。

于 2009-09-17T22:57:50.507 に答える
10

SearchTools-Aviは、「MySQLテキスト検索。3文字以下の単語も索引付けしない」と述べた。

参考までに、少なくともMySQL 5.0以降、MySQLフルテキストの最小単語長は調整可能です。簡単な手順については、Googleの「mysqlfulltextminlength」。

とは言うものの、MySQLフルテキストには制限があります。たとえば、100万レコード程度に達すると、更新が遅くなります...

于 2009-09-28T00:51:39.907 に答える