我在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
答案 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
为字段,article
,oem
和size
为属性< / em>的。
但您的RT索引,article
和oem
为字段,size
为属性。
因此,直接创建的独立RT索引将具有名为oem
的字段。但是从磁盘索引转换的索引将oem
作为属性。
为了澄清为什么会这样,所有ATTACH
实际上都是采用磁盘索引并重命名其文件,因此它们成为RT索引的第一个块。磁盘索引不再存在,并且具有基于磁盘索引的新RT索引。索引设置本身都来自磁盘索引(来自磁盘索引的头文件,成为RT索引的头文件)。
它没有尝试变形磁盘索引的内容以匹配RT索引的配置,因为大多数/许多变形是不可能的,从数据创建索引是一个有损的过程,它无法撤消(所以它可以用不同的设置重做)。
...因此,RT索引定义中将忽略大多数设置(字段/属性和标记化设置等)。新的RT索引与配置不同。在大多数情况下,实际使用的唯一真实设置是path
,因此它知道索引文件的放置位置。
答案 1 :(得分:0)
文档说:
截至2.0.2-beta,ATTACH INDEX有许多限制。最值得注意的是,目标RT索引当前必须为空,使ATTACH INDEX仅为一次转换操作。在将来的版本中可能会解除这些限制,因为我们将所需的功能添加到RT索引中。完整清单如下。
请参阅http://sphinxsearch.com/docs/2.0.8/sphinxql-attach-index.html
在您的情况下,rt_test
最初并非空。我怀疑这就是问题的原因。
<强> UPADTE 强>
您可以通过在查询的最开头添加“@@ relaxed”来解决此问题,将其转换为警告。