Cackleレビュー全文検索フィードバック収集システム

みなさんこんにちは! 少し前まで、 Cackle Reviewsレビューシステムの全文検索を実装しました。 素晴らしい結果が得られ、モデレーターは単語または文ごとに数ミリ秒でコメントを見つけることができ、ステミング(単語またはその単語形式の一部によるファジー検索)をサポートしています。 これはすべて、フルテキスト検索エンジンであるSphinxで機能します。



インターネットにはSphinxに関する多くの記事がありますが、残念ながら、それらのいくつかは時代遅れであり、他のいくつかは完全で正確な方法を主張していません。 そのため、この投稿では、すべての手順(インストール、構成、インデックス作成、デルタインデックスのサポート)を説明しようとしました。



Cackle Reviews全文検索レビューシステム








1. Sphinxのインストール



すでに述べたように、 Sphinxは全文検索システムです。 Sphinxの選択は偶然ではなく、事実、このシステムはエンジンの速度と機能を比較するいくつかのテストに基づいて最速であるという事実です。



インストールドキュメントはあまり良くありません。 したがって、Sphinxと対話するには、MySQLクライアント(Sphinx APIを操作するため)とSphinx自体が必要です。 以下は、Linuxに必要なすべてのライブラリをインストールするコマンドです(この例ではLinux Debian 8 64ビットを使用しています)。



#    MySQL  apt-get     /etc/apt/sources.list deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.6 deb-src http://repo.mysql.com/apt/debian/ wheezy mysql-5.6 #   MySQL apt-get install mysql-client unixodbc libpq5 libmysqlclient18 #    Sphinx (    2.2.9) wget http://sphinxsearch.com/files/sphinxsearch_2.2.9-release-1~wheezy_amd64.deb #  dpkg -i sphinxsearch_2.2.9-release-1~wheezy_amd64.deb
      
      







2. Sphinxの構成



インストールが成功した場合、sphinxsearchデーモンがLinuxに表示されるはずです。これは今のところ停止できます( /etc/init.d/sphinxsearch stop



)。 次に、インデックスを格納するためのディレクトリ構造を作成する必要があります。この場合、メインインデックスとデルタインデックスの2つがあります。 メインはすべてのデータを保存しますが、デルタは今日のみインデックス作成を高速化するためのものです。



 mkdir /opt/sphinx mkdir /opt/sphinx/data #   mkdir /opt/sphinx/data/review #   mkdir /opt/sphinx/data/review_delta #  mkdir /opt/sphinx/log/
      
      





Sphinxの設定を編集します(デフォルトでは/etc/sphinxsearch/sphinx.conf)。 すべてのレビューがレビューテーブルに保存され、フィールドにインデックスが付けられていることを明確にする必要があります。





 #   ,    ( PostgreSQL) source base { type = pgsql sql_host = 162.198.0.3 sql_user = postgres_login sql_pass = postgres_password sql_db = cackle sql_port = 5179 } #    index base { #  charset_type = utf-8 #        morphology = stem_enru #     2  min_word_len = 2 } #  review     source review : base { #     search_fulltext #      id   review ( id  search_fulltext    ) sql_query_pre = DELETE FROM search_fulltext WHERE type = 'review' sql_query_pre = INSERT INTO search_fulltext SELECT 'review', MAX(id) FROM review #   id, site_id, status, pros, cons, comment   review sql_query = SELECT id, site_id, status, pros, cons, comment FROM review #      sql_attr_uint = site_id #      (,  , , ) sql_attr_uint = status } #  review         review #    /opt/sphinx/data/review index review : base { source = review path = /opt/sphinx/data/review } #     review source review_delta : review { #    ,   sql_query_pre     review #    -   SQL (SELECT 1) sql_query_pre = SELECT 1 #       ,   id,    id   search_fulltext sql_query = SELECT id, site_id, status, pros, cons, comment FROM review WHERE id > (SELECT id FROM search_fulltext WHERE type = 'review') } #   index review_delta : review { source = review_delta path = /opt/sphinx/data/review_delta } #   searchd #    mysql (mysql_version_string = 5.5.21)        searchd { listen = localhost:9306:mysql41 mysql_version_string = 5.5.21 log = /opt/sphinx/log/searchd.log query_log = /opt/sphinx/log/query.log pid_file = /opt/sphinx/log/searchd.pid }
      
      







3.起動



すべての準備ができたら、searchdデーモン(/etc/init.d/sphinxsearch start)を開始し、レビューレビュー(メインインデックス)を開始できます。

indexer --config /etc/sphinxsearch/sphinx.conf review







全文検索レビューCackleレビュー


したがって、730,422件のレビューはすべて84秒で索引付けされました。 これで、MySQL(mysql:// localhost:9306)を介してSphinxに接続し、SQLコマンドを検索できます。



 #  id      1   '',   id,   0  15 SELECT id FROM review WHERE site_id = 1 AND MATCH('') ORDER BY id DESC LIMIT 0,15 #  id      1, 2, 738, 35302   1 (), 3 () SELECT id FROM review WHERE site in (1, 2, 738, 35302) AND status in (1, 3) AND MATCH(' ') ORDER BY id DESC LIMIT 0, 15
      
      





数ミリ秒で、レビューのIDを取得します。このIDに基づいて、レビューテーブルからメインデータベースから選択を行い、結果をクライアントに返すことができます。



4.デルタインデックスの設定



すでに述べたように、小さなデータサイズにすばやくインデックスを作成するには、デルタインデックスが必要です。 私たちの場合、これらはすべて当日に蓄積された新しいレビューです。 この設定では、クラウンに2つのジョブを作成します。



 crontab -e #  5    review_delta (  id    id   search_fulltext) */5 * * * * indexer --rotate --quiet --config /etc/sphinxsearch/sphinx.conf review_delta #    (  )   review_update.sh 0 1 * * * /opt/sphinx/review_update.sh
      
      





review_update.shスクリプトは、review_deltaインデックス作成を開始し、search_fulltextテーブルの最大IDを更新し、レビューとreview_deltaインデックスの結果をマージします。



 PGPASSWORD=postgres_password; export PGPASSWORD; indexer --rotate --quiet --config /etc/sphinxsearch/sphinx.conf review_delta; psql --host 162.198.0.3 --port 5179 --username "postgres_login" -c "UPDATE search_fulltext SET id = (SELECT MAX(id) FROM review) WHERE type = 'review'" "cackle"; indexer --merge review review_delta --rotate --quiet --config /etc/sphinxsearch/sphinx.conf;
      
      





その後、review_deltaテーブルをSQL検索クエリに追加すると、メインとデルタの2つのインデックスからすぐに選択されます。



 #  id      1   '',   id,   0  15 SELECT id FROM review, review_delta WHERE site_id = 1 AND MATCH('') ORDER BY id DESC LIMIT 0,15 #  id      1, 2, 738, 35302   1 (), 3 () SELECT id FROM review, review_delta WHERE site in (1, 2, 738, 35302) AND status in (1, 3) AND MATCH(' ') ORDER BY id DESC LIMIT 0, 15
      
      





この実装には1日かかりました。その結果、安定性のある全文検索を作成しました。この検索は、数か月間、問題なく動作します。 ちなみに、 Cackle Commentsコメントシステムに同様の構成とジョブ(レビューはコメントに置き換えられます)を追加すると、コメントの検索が実装されました。



質問は大歓迎です。 ご清聴ありがとうございました。 すべて成功!



All Articles