Sphinx:在ATTACH索引之后没有在模式中找到字段

时间:2013-07-26 08:14:15

标签: sphinx

我在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
}

我在shell中运行命令:

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-release(r3831),Xubuntu x64

2 个答案:

答案 0 :(得分:1)

直接比较您的索引定义,它们不一样。

        'stub' as `stub`, \
        article `article`, \
        oem `oem`, \
        size `size` \

sql_attr_string      = article
sql_attr_string      = oem
sql_attr_string      = size

====================

    rt_field        = article
    rt_field            = oem 
rt_attr_string      = size

所以你的磁盘索引,stub字段articleoemsize属性< / em>的。

但您的RT索引,articleoem字段size属性

因此,直接创建的独立RT索引具有名为oem字段。但是从磁盘索引转换的索引将oem作为属性


为了澄清为什么会这样,所有ATTACH实际上都是采用磁盘索引并重命名其文件,因此它们成为RT索引的第一个块。磁盘索引不再存在,并且具有基于磁盘索引的新RT索引。索引设置本身都来自磁盘索引(来自磁盘索引的头文件,成为RT索引的头文件)。

它没有尝试变形磁盘索引的内容以匹配RT索引的配置,因为大多数/许多变形是不可能的,从数据创建索引是一个有损的过程,它无法撤消(所以它可以用不同的设置重做)。

...因此,RT索引定义中将忽略大多数设置(字段/属性和标记化设置等)。新的RT索引与配置不同。在大多数情况下,实际使用的唯一真实设置是path,因此它知道索引文件的放置位置。

答案 1 :(得分:0)

文档说:

截至2.0.2-beta,ATTACH INDEX有许多限制。最值得注意的是,目标RT索引当前必须为空,使ATTACH INDEX仅为一次转换操作。在将来的版本中可能会解除这些限制,因为我们将所需的功能添加到RT索引中。完整清单如下。

  • 目标转化指数必须为空。
  • 源磁盘索引需要index_sp = 0,boundary_step = 0,stopword_step = 1,dict = crc settings。
  • 源磁盘索引需要设置为空的index_zones。

请参阅http://sphinxsearch.com/docs/2.0.8/sphinxql-attach-index.html

在您的情况下,rt_test最初并非空。我怀疑这就是问题的原因。

<强> UPADTE

您可以通过在查询的最开头添加“@@ relaxed”来解决此问题,将其转换为警告。