sphinx日常使用记录-1
最近的开发的一个项目中用到了sphinx,在此记录一下。
我这里用的是sphinx2.2.11版本,安装的步骤这里的省略过。
首先第一步是建立配置, sphinx的配置文件在sphinx/etc/sphinx.conf文件中
#!/usr/bin/php
<?php
$host = '127.0.0.1';
$port = '3306';
$database = 'blog';
$user = 'root';
$password = 'root';
$files = scandir(dirname(__FILE__) . "/conf.d/");
foreach($files as $key => $file) {
if($file != "." && $file != ".." && preg_match('/.conf$/iU', $file) ) {
include(dirname(__FILE__) . "/conf.d/$file");
}
}
?>
indexer
{
mem_limit = 512M
}
searchd
{
listen = 9312
log = /usr/local/sphinx/var/log/searchd.log
query_log = /usr/local/sphinx/var/log/query.log
read_timeout = 5
max_children = 30
pid_file = /usr/local/sphinx/var/log/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /usr/local/sphinx/var/data
}
第一行的:#!/usr/bin/php 代表用php来执行下面代码。
前面先设置好mysql的各个配置,主机、端口号、数据库、用户名、密码。后续建立索引的时候需要靠这几项配置连接mysql获取数据,然后建立、更新索引。
$files = scandir(dirname(__FILE__) . "/conf.d/");
这一段开始是查询当前/conf.d/目录下的文件,后续我们的索引配置文件都放在这个文件夹中。
下面以blog表为例,写一份sphinx的索引配置文件
blog表结构:
CREATE TABLE `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '创建用户ID,外键,关联到用户表',
`reading_num` int(11) NOT NULL DEFAULT '0' COMMENT '阅读量',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0-正常,1-禁用',
`ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '发布的ip地址',
`ip_location` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'ip地址归属地',
`content_type` int(11) NOT NULL DEFAULT '0' COMMENT '内容类型 1=纯文本 2=图片 3=音频 4=视频 5=文件',
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'ip地址归属地',
`content` text COLLATE utf8mb4_general_ci NOT NULL,
`create_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `uid` (`user_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='博客';
user表结构:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码',
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '邮箱',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '用户状态 0 正常 1禁用',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除: 0=否, 1=是',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_phone` (`phone`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=217 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户';
现在的需求是输入关键字,搜索出对应的blog。关联的字段有content(内容)、title(标题)、username(用户表中的username)
因为搜索的有一个字段(username)是在另外一个表中,所以需要用到联表查询。
sphinx/etc/conf.d/blog.conf配置文件大概是这样:
source blog
{
type = mysql
sql_host = <?php echo $host; ?> #
sql_user = <?php echo $user; ?> #
sql_pass = <?php echo $password; ?> #
sql_db = <?php echo $database; ?> #
sql_port = <?php echo $port; ?> #
sql_query_pre = SET NAMES utf8
sql_query = \
select b.id, b.content_type, b.content, u.username from blog b inner join user u on b.user_id=u.id where b.deleted=0
sql_attr_uint = content_type
}
index blog
{
source = blog
path = /usr/local/sphinx/var/data/blog
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
#charset_dictpath=/usr/local/mmseg3/etc
#stopwords=/usr/local/
html_strip=0
ngram_len = 1
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
ngram_chars = U+3000..U+2FA1F
}
这里关于数据库配置的变量就是前面sphinx/etc/sphinx.conf中定义的变量。
sql_query这个地方是最主要的部分,把我们需要查询的字段写进来,sphinx需要查询的数据有一个唯一的id,所以要把id也写进来。
sql_attr_uint:这个设置是当需要有额外的查询的时候,需要添加这里的设置。如果我们的查询条件是content_type=1,关键字为:模型。这种条件的话, 就必须要把content_type添加到sql_attr_uint中,不然的话,就算你把content_type放在sql_query语句中,结果也是不生效的。
切换到sphinx目录下
cd /usr/local/sphinx
执行命令
./bin/indexer blog --rotate
没有报错就表示建立索引成功了,从上图中可以看到已经写入了一条数据。
配置文件中的有些配置现在我也不是很清楚,照着前面人的配置写的,有熟悉的同学,欢迎一起讨论
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: