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

sphinx日常使用记录-1
没有报错就表示建立索引成功了,从上图中可以看到已经写入了一条数据。
配置文件中的有些配置现在我也不是很清楚,照着前面人的配置写的,有熟悉的同学,欢迎一起讨论

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
alante

换成es,哈哈,现在几乎不用这个了

1个月前 评论

现在这个不流行了,大家都用es

1个月前 评论
doublefacekill (楼主) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!