Coreseek®  
 | 首页 | 注册 | 回复 | 搜索 | 统计资料 |                 网站首页产品服务开放源码安装使用常见问题中文手册社区交流联系我们 
全文检索 论坛首页 / 全文检索 /

关于“复合主键的问题”

 
nonamexz
会员
#1 | 发表时间: 2010 08 22 18:11 | 修改: nonamexz
回复 
本人刚刚接触Sphinx,用了近一周的时间看了一些Sphinx相关的资料,今天花一天的时间终于在测试环境上把csft-3.2.12安装成功了,遇到了一些问题,求高手赐教!

由于对Sphinx不熟悉,先将我这里的环境描述一下,内容可能比较多,主要是想表达以下几点:

1、64位的操作系统
2、数据库使用的是复合主键,且userId是bigint类型
3、建立索引的时候报出两个Warning:
  WARNING: zero/NULL document_id, skipping
   WARNING: duplicate document ids found


问题:
   复合主键如何定义sql_query才能不出现重复docid.
   建立索引的Warning对后续的使用会有影响吗?



环境描述:

A,环境
操作系统,CentOS 5.4 64位。
数据库: Mysql 5.1.50 编译安装
Sphinx: csft-3.2.12
Sphinx编译参数:
./configure --prefix=/usr/local/sphinx --with-python --enable-id64 --with-iconv --with-mysql=/usr/local/mysql5150 --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/

B,要建索引的Mysql表结构:
CREATE TABLE `Message` (
  `userId` bigint(20) NOT NULL DEFAULT '0',
  `serialNo` int(11) NOT NULL,
  `msgSender` bigint(20) DEFAULT NULL,
  `msgFrom` tinyint(4) DEFAULT NULL,
  `msgContent` varchar(8000) NOT NULL,
  `msgTime` datetime DEFAULT NULL,
  `msgStatus` tinyint(4) DEFAULT NULL,
  `msgType` smallint(6) DEFAULT '1',
  `msgTitle` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`userId`,`serialNo`),
  KEY `msgTime` (`msgTime`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

C,Sphinx参数sql_query介绍
    获取文档的主查询。必须的选项,无默认选项。仅适用于SQL数据源(mysql和pgsql)。
    只能有一个主查询。它被用来从SQL服务器获取文档(文档列表)。可以指定多达32个全文数据字段(严格来说是在sphinx.h中定义的SPH_MAX_FIELDS个)和任意多个属性。所有既不是文档ID(第一列)也不是属性的列的数据会被用于建立全文索引。
    文档ID必须是第一列,而且必须是唯一的正整数值(不能是0也不能是负数),既可以是32位的也可以是64位的,这要根据Sphinx是如何被构建的,默认情况下文档ID是32位的,但在运行configure脚本时指定--enable-id64选项会打开64位文档ID和词ID的支持。

D,csft.conf 部分配置信息
source Message
{
        type = mysql
        sql_host = localhost
        sql_user = admin
        sql_pass = mypassword
        sql_db = test
        sql_port = 5150
        sql_sock = /tmp/mysql5150.sock
        sql_query_pre = SET NAMES utf8
        sql_query =  \
              SELECT userId,serialNo,msgFrom,msgStatus,msgType,UNIX_TIMESTAMP(msgTime) AS msgTime, msgContent \
              FROM Message

        sql_attr_uint = serialNo
        sql_attr_uint = msgFrom
        sql_attr_uint = msgStatus
        sql_attr_uint = msgType
        sql_attr_timestamp = msgTime
        sql_ranged_throttle = 0
}

E 创建索引
using config file '/usr/local/sphinx/etc/csft.conf'...
indexing index 'Message'...
WARNING: zero/NULL document_id, skipping
collected 9988 docs, 1.5 MB
sorted 3.3 Mhits, 92.4% done
WARNING: duplicate document ids found
total 9988 docs, 1457793 bytes
total 1.745 sec, 835074 bytes/sec, 5721.47 docs/sec
HonestQiao
会员
#2 | 发表时间: 2010 08 23 13:35
回复 
同一个索引,sql_query查询第一个字段必须为整数,必须为不重复的。
nonamexz
会员
#3 | 发表时间: 2010 08 23 18:26
回复 
谢谢HonestQiao的回复,但现实情况是,我生产环境的确有这样的一个表,它是复合主键,userId的确会出现重复。这样有什么办法可以解决 duplicate document ids found 的问题吗?
HonestQiao
会员
#4 | 发表时间: 2010 08 24 16:57
回复 
采用python source数据源,在程序里面,够着一个i++的量,作为主键,就非常非常简单了。
nonamexz
会员
#5 | 发表时间: 2010 08 24 19:31
回复 
虽然我没看明白是什么意思,但我还是得感谢你的回复,我把您的建议给我们的开发人员看看,也许他们能理解。
HonestQiao
会员
#6 | 发表时间: 2010 08 25 11:52
回复 
简单来说,递送给coreseek的查询的第一个字段,必须为整数字段,而且不可重复。

要么你的数据表本身支持,要么你的查询使用视图、函数等来变相实现,要么采用python数据原来读取从而在程序中构造。
 
回复
Bold Style  Italic Style  Image 链接  URL 链接 
发帖注意:
  • 网址中请去掉http://开头,例如:您需要输入www.coreseek.cn,而不是http://www.coreseek.cn
  • 咨询问题,请贴出详细的操作系统版本、Coreseek版本(Linux环境请给出编译参数)
  • 请仔细查看中文手册和本站安装指南,确认操作正确
  • 请仔细查看常见问题解答,也许你的问题已经有解决方法

» 帐号  » 密码 
发帖前请登陆, 或者 注册 .