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');

狮身人面像中的索引

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 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

4

2 回答 2

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

因此,您的磁盘索引具有stubas a field、andarticle和as attributesoemsize

但是您的 RT 索引具有articleoem作为fieldssizeas a attribute

因此,直接创建的独立 RT 索引一个名为oem. 但是从磁盘索引转换而来的索引将oem具有属性


为了澄清为什么会这样,ATTACH真正要做的就是获取磁盘索引,并重命名其文件,因此它们成为 RT 索引的第一块。磁盘索引不再存在,并基于磁盘索引有一个新的 RT 索引。索引设置本身都是取自磁盘索引(磁盘索引的头文件,成为RT索引的头文件)。

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

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

于 2013-07-26T11:36:16.847 回答
0

文档说:

从 2.0.2-beta 开始,ATTACH INDEX 带有许多限制。最值得注意的是,当前要求目标 RT 索引为空,使得 ATTACH INDEX 仅是一次性转换操作。随着我们向 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,最初不是空的。我怀疑这是问题的原因。

更新

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

于 2013-07-26T08:23:54.137 回答