スフィンクス増分インデックスの実装例

大家讲道理
リリース: 2016-11-08 14:28:48
オリジナル
1127 人が閲覧しました

注: Sphinx の増分インデックスは実際には 2 つのインデックスによって実装されています (メイン インデックスは毎朝更新され、増分インデックスは 5 分ごとに生成されます)。インターネットでは、インデックス マージによって 1 つのインデックスに統合できると言われています。しかし、実際にマージしないようにしてみました


スフィンクスの増分インデックス設定 データベース内の既存のデータは非常に大きく、新しいデータがデータベースに常に追加されているので、それを取得できるようにしたいと考えています。更新する必要があるデータが比較的小さいため、完全なインデックスの再作成にはコストがかかります。 例えば。元のデータは数百万件ありましたが、新しいデータは数千件のみでした。このように、「メイン インデックス + 増分インデックス」モードを使用して、ほぼリアルタイムの更新機能を実現できます。
これ このモードを実装する基本原則は、2 つのデータ ソースと 2 つのインデックスを設定し、基本的に更新されないデータと新しいデータに対してメイン インデックスを確立することです。 増分データの増分インデックスを作成します。メイン インデックスの更新頻度は長く設定でき (たとえば、毎日午前 0 時に設定)、増分インデックスの更新頻度は非常に短く設定できます (数分程度)。 右)これにより、ユーザーが検索するときに、これら 2 つのインデックスのデータを同時にクエリできるようになります。
「メイン インデックス + 増分インデックス」方式を使用した簡単な実装があります。データベースにカウント テーブルを追加して、メイン インデックスが再構築されるたびにインデックス付きテーブルの最後のデータ ID を記録します。これにより、増分インデックスのみが作成されます。この ID の後にデータのインデックスを作成し、メイン インデックスが再構築されるたびにこのテーブルを更新するだけで済みます。
テスト条件: デフォルトの sphinx.conf 構成を例として、データベース テーブル データを example.sql として取り上げます。

1. 関連テーブルを作成します

创建主索引表
 CREATE TABLE `sph_test1` (
  `id` int(10) unsigned NOT NULL,
  `weight` int(11) NOT NULL,
  `query` varchar(3072) CHARACTER SET latin1 NOT NULL,
  `group_id` int(11) DEFAULT NULL,
  KEY `query` (`query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/test1'
创建索引计数表
     CREATE TABLE `sph_counter` (
  `id` int(11) NOT NULL,
  `max_doc_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)
创建增量索引表
 CREATE TABLE `sph_delta_test1` (
  `id` int(10) unsigned NOT NULL,
  `weight` int(11) NOT NULL,
  `query` varchar(3072) NOT NULL,
  `group_id` int(11) DEFAULT NULL,
  KEY `query` (`query`(1024))
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/delta_test1'
ログイン後にコピー

2. sphinx.conf を変更します

source src1{
       type                = mysql
       sql_host            = localhost
       sql_user            = yourusername
       sql_pass            = yourpassword
       sql_db              = test   //你所用的数据库
       sql_port            = 3306 //所用端口,默认是3306
       sql_query_pre       = SET NAMES utf8
       sql_query_pre       = sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents 
       sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title,\
                 content FROM documents \
               WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
// 注意:delta_src 中的sql_query_pre的个数需和main_src 对应,否则可能搜索不出相应结果
source delta_src1: src1{
         sql_ranged_throttle = 100
         sql_query_pre       = SET NAMES utf8
         sql_query_pre       = SET SESSION query_cache_type=OFF
         sql_query      = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents\
            WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
index test1 //主索引{
       source           = src1
       path             = /usr/local/sphinx/var/data/test1
       charset_type     = utf-8    #这个是支持中文必须要设置的
       chinese_dictionary =/usr/local/sphinx/etc/xdict       #..........其它可以默认
}
 
index delta_test1: src1 //增量索引{
         source = delta_src1
         path     = /usr/local/sphinx/var/data/delta_src1
}
ログイン後にコピー

3. スケジュールされたタスクによってインデックスを生成します (--rotate パラメーターは、サービス インデックスを再起動せずに有効になります)。午前: ./indexer test1 --rotate

b. 10 分ごとに増分インデックスを生成します: ./indexer delta_test1 --rotate

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!