0

MySQLにテーブルがあります

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `article` varchar(50) NOT NULL,
  `oem` varchar(50) NOT NULL,
  `size` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

INSERT INTO `test` (`id`, `article`, `oem`, `size`) VALUES
(1, '92S400', '11223', '300x200x200'),
(2, '92S400', '11224', '300x150x200');

と Sphinx のインデックス

source s_test
{
    type            = mysql

    sql_host        = localhost
    sql_user        = root
    sql_pass        = 123
    sql_db          = auto
    sql_port        = 3306

    sql_query_pre   = SET NAMES cp1251
    sql_query_pre   = SET CHARACTER SET cp1251

    sql_query       = \
        SELECT \
            id `id`, \
            'stub' as `stub`, \
            article `article`, \
            oem `oem`, \
            size `size` \
        FROM \
            test

    sql_attr_string      = article
    sql_attr_string      = oem
    sql_attr_string      = size

    sql_query_info       = SELECT * FROM test WHERE id=$id
}

index i_test
{
    source            = s_test

    path            =  /var/lib/sphinx/i_test

    min_word_len        = 1
    enable_star         = 0
    min_prefix_len      = 3
    expand_keywords     = 1
    index_sp = 0
    stopword_step = 1
    dict=crc
}

index rt_test
{
    type                = rt
    rt_mem_limit        = 2047M

    path                = /var/lib/sphinx/test
    enable_star         = 1
    min_prefix_len      = 3
    expand_keywords     = 1
    dict                = keywords
    morphology          = stem_en

    charset_table = 0..9, A..Z->a..z, _, a..z, U+A8->U+E5, U+B8->U+E5, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF

    rt_field        = article
    rt_field            = oem

    rt_attr_string      = size
}

シェルでコマンドを実行します:

searchd --stop
rm /var/lib/sphinx/*
indexer --all
searchd

たとえば、「INSERT」コマンドで rt_test データに挿入する場合

INSERT INTO rt_test VALUES (1, '92S400', '11223', '300x200x200'),
(2, '92S400', '11224', '300x150x200');

「select .. MATCH」に問題はありません。

SELECT * FROM rt_test WHERE MATCH('@oem 11223')\G;

*************************** 1. row ***************************
id: 1
weight: 1643
  size: 300x200x200

ただし、ファイルを削除した場合は、インデクサーを再実行して attach コマンドを実行します

ATTACH INDEX i_test TO RTINDEX rt_test;

Sphinx は、前の 'SELECT .. MATCH' クエリでエラーを表示します。

ERROR 1064 (42000): index rt_test: query error: no field 'oem' found in schema

mysql テーブルのデータは rt_index に存在します。インデックス rt_oem と rt_article が消えるのはなぜですか?

PS Sphinx 2.0.8 リリース (r3831)、Xubuntu x64

4

2 に答える 2

0

ドキュメントには次のように記載されています。

2.0.2-beta の時点で、ATTACH INDEX には多くの制限があります。最も注目すべきは、現在、ターゲット RT インデックスを空にする必要があるため、ATTACH INDEX を 1 回限りの変換操作のみにすることです。これらの制限は、必要な機能を RT インデックスに追加するため、将来のリリースで解除される可能性があります。完全なリストは次のとおりです。

  • ターゲット RT インデックスは空である必要があります。
  • ソース ディスク インデックスには、index_sp=0、boundary_step=0、stopword_step=1、dict=crc 設定が必要です。
  • ソース ディスク インデックスには、空の index_zones 設定が必要です。

http://sphinxsearch.com/docs/2.0.8/sphinxql-attach-index.htmlを参照してください

あなたの場合、rt_test最初は空ではありませんでした。それが問題の原因だったと思います。

UPADTE

この問題を回避するには、クエリの先頭に「@@relaxed」を追加して、これを警告にします。

于 2013-07-26T08:23:54.137 に答える