3

私は現在、2,000万以上のレコードを持つMySQLクエリのインデックス作成にSphinxを使用しています。

デルタインデックスを使用してメインインデックスを更新し、すべての新しいレコードを追加しています。

残念ながら、テーブルへの変更の割り当ては削除されます。

sql_query_killlistを使用して、削除または更新する必要のあるすべてのドキュメントIDを取得できることを理解しています。残念ながら、これが実際にどのように機能するかを理解しておらず、Sphinxのドキュメントには私が理解するのに十分な例がありません。

次の例を使用する場合、どのようにキルリストを実装できますか?

MySQLで

CREATE TABLE sph_counter
(
    counter_id INTEGER PRIMARY KEY NOT NULL,
    max_doc_id INTEGER NOT NULL
);

sphinx.confで

source main
{
    # ...
    sql_query_pre = SET NAMES utf8
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
    sql_query = SELECT id, title, body FROM documents \
        WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

source delta : main
{
    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id, title, body FROM documents \
        WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

インデックスメイン

{
    source = main
    path = /path/to/main
    # ... all the other settings
}

他のすべての設定がメインからどのようにコピーされるかに注意してください。ただし、ソースとパスはオーバーライドされます(必ずオーバーライドされます)。indexdelta:main

{
    source = delta
    path = /path/to/delta
}
4

1 に答える 1

6

詳細は、削除されたドキュメントにマークを付ける方法に大きく依存します。しかし、次のようなものを追加するだけです

 sql_query_killist = SELECT id FROM documents 
                     WHERE status='deleted' 
                           AND id<=( SELECT max_doc_id FROM sph_counter 
                                     WHERE counter_id=1 )

デルタインデックスに。これにより、メインインデックスにある削除済みレコードのIDがキャプチャされ、検索結果に表示されないようにキルリストに追加されます。

更新されたレコードをキャプチャする場合は、新しい行がデルタのメインsql_queryに含まれ、それらのIDがキルリストに含まれるように調整する必要があります。

于 2012-08-09T18:14:50.320 に答える