1

1 つのテーブルのデータを使用して構築された4 つのsphinxインデックスがあります。異なるドキュメントを使用することを除いて、すべてのインデックスのソース設定は同じです。mod(id, 4) = <index number>ドキュメントとドキュメント属性をインデックス間で分散するために、このようなチェックがあります。

質問:インデックスを再構築するたびに、4 つのインデックスのうちの 1 つ (同じもの) が再構築に失敗します。他のインデックスではこの問題は発生せず、正しく再構築されます。

ドキュメントと属性テーブルを分割しました。たとえば、次のようにドキュメント テーブルが分割されます。

PARTITION BY HASH(mod(id, 4))(
  PARTITION `p0` COMMENT '',
  PARTITION `p1` COMMENT '',
  PARTITION `p2` COMMENT '',
  PARTITION `p3` COMMENT ''
);

インデクサーは、すべてのドキュメントを受信した後、属性の受信を開始する前にハングすると考えられます。これは、MySQL サーバーのセッションを確認するとわかります。

再構築に失敗したインデックスは使用中mod(id, 4) = 0です。

Ubuntu 64 ビット 12.04.02 LTS で Sphinx 2.0.4 リリースを使用します。


データ ソース構成

source ble_job_2 : ble_job
{
    sql_query = select job_notice.id as id, \
        body, title, source, company, \
        UNIX_TIMESTAMP(insertDate) as date, \
        substring(company, 1, 1) as companyletter, \
        job_notice.locationCountry as country, \
        location_us_state.stateName as state, \
        0 as expired, \
        clusterId, \
        groupCity, \
        groupCityAttr, \
        job_notice.cityLat as citylat, \
        job_notice.cityLng as citylng, \
        job_notice.zipLat as ziplat, \
        job_notice.zipLng as ziplng, \
        feedId, job_notice.rating as rating, \
        job_notice.cityId as cityid \
        from job_notice \
        left join location_us_state on job_notice.locationState = location_us_state.stateCode \
        where job_notice.status != 'expired' \
        and mod(job_notice.id, 4) = 1

    sql_attr_multi = uint attr from query; \
        select noticeId, attributeId as attr from job_notice_attribute where mod(noticeId, 4) = 1
} # source ble_job_2

インデックス構成

index ble_job_2
{
    type            = plain
    source          = ble_job_2
    path            = /var/lib/sphinxsearch/data/ble_job_2

    docinfo         = extern
    mlock           = 0
    morphology      = none
    stopwords       = /etc/sphinxsearch/stopwords/blockwords.txt
    min_word_len    = 1
    charset_type    = utf-8
    enable_star     = 0
    html_strip      = 0
} # index_ble_job_2

どんな助けでも大歓迎です。

敬具。

4

1 に答える 1

0

幸いなことに、問題は修正されました。

範囲クエリの設定を適用したことで、インデックスの再構築が安定しました。これは、Sphinx が複数のクエリを実行し、それぞれが限られた比較的小さな結果セットを返すためだと思います。これにより、MySQL はクエリを正常に完了し、すべての結果を Sphinx に送り返すことができます。

同じ問題が Sphinx フォーラムのIndexer Hangs & MySQL Query Sleepsで説明されています。


データ ソースの構成の変更点は次のとおりです。

    sql_query_range = SELECT MIN(id),MAX(id) FROM job_notice where mod(job_notice.id, 4) = 1
    sql_range_step = 200000
    sql_query = select job_notice.id as id, \
    ...
        and mod(job_notice.id, 4) = 1 and job_notice.id >= $start AND job_notice.id <= $end

sql_attr_multi クエリに範囲を適用しないでください - Sphinx MVA の不正なクエリ

于 2013-03-11T14:31:33.643 に答える