场景

在我过去的博客中, 我写过一个sphinx 的安装使用以及配置的系列, 欢迎各位在我的空间中查找。

现在, 我的开发环境切换到了mac上, 使用的系统是mac 下的osx, 需要重新安装环境,所以这里记录下我在mac上安装sphinx的流程以及如何使用Python 连接sphinx 服务实现简单关键字搜索查询

安装

mac 下使用 brew即可完成安装

brew 安装

brew 中已经包含了sphinx, 我们可以直接使用brew执行安装

brew install sphinx --with-mysql --with-re2

执行完成后就安装好了sphinx

注意, 这里我带了两个参数 --with-mysql 和 --with-re2

--with-mysql: 带这个参数是为了让sphinx 能支持mysql协议, 让我们能以mysql的操作方式操作sphinx

--with-re2: 带这个参数是为了将sphinx默认的正则引擎改为re2, 性能更高

创建索引和启动服务

这个可以参考我以前写的部分:

sphinx 索引的创建(一) https://www.u3v3.com/ar/1079

sphinx 索引的创建(二) https://www.u3v3.com/ar/1080

sphinx 索引服务的启动和测试 https://www.u3v3.com/ar/1091

sphinx 增量索引更新 https://www.u3v3.com/ar/1118

Python处理搜索

这里使用的是python3.4

基于我们已经创建的索引和启动的搜索服务, 我们的应用进程需要连接该服务, 并提供关键词搜索结果

sphinx 提供了对 mysql 协议的支持, 所以,我们在可以通过pymysql 直连 sphinx 的搜索服务

连接搜索服务

sphinx 索引的创建(二) 中我们可以看到 searhd 的相关配置

searchd{
    listen  = 3316 #索引服务启动后, 外部api可以通过3316端口访问
    listen = localhost:9306:mysql41 #客户端可以通过mysql 协议对9306端口进行访问
    log     = /data/log/sphinx/searchd.log #索引服务日志
    query_log = /data/log/sphinx/query.log #索引搜索请求日志
    pid_file = /var/run/sphinx/searchd.pid #索引服务pid 存储位置
    binlog_path = /data/sphinx/test/binlog #Binary log, 用于数据恢复,索引服务崩溃时, 可以从binlog_path 读取崩溃时的索引数据重新加载
}

第二个listen = localhost:9306:mysql41 就表示本地的9306端口已经是sphinx 的mysql 服务端口了。

我们通过pymysql 即可连接服务

con = pymysql.connect(host='127.0.0.1', port=9306, user="", passwd="", db="")

注意: 这里的user, passwd, db均填写空

现在, 我们就可以通过sql 查询来实现关键词搜索了

搜索关键词

搜索关键词要使用match来实现关键词匹配

with con.cursor(pymysql.cursors.DictCursor) as cur:
    cur.execute("select * from article, article_delta where match('vim') limit 3")
    print(cur.fetchall())

打印的结果如下:

[{'ar_cid': 2, 'tags': 'vim', 'ctime': 1462524370, 'comment_count': 0, 'humanrank': 0, 'title': 'VIM 高效编辑常用命令', 'description': '帮助刚刚接触VIM的新手更加有效率的使用这个出色的编辑器。\r\n主要总结了在不同工作模式, 即插入模式(insert mode),命令模式(command mode)下使用VIM的一些基本编辑技巧。', 'id': 1097, 'click': 19, 'stow': 0}, {'ar_cid': 12, 'tags': 'vim', 'ctime': 1460368429, 'comment_count': 0, 'humanrank': 0, 'title': 'vim常用命令介绍', 'description': '经常用的的vim命令', 'id': 4, 'click': 0, 'stow': 0}, {'ar_cid': 2, 'tags': 'vim', 'ctime': 1462237455, 'comment_count': 0, 'humanrank': 0, 'title': 'vimCommond1 vim', 'description': 'vim  haha', 'id': 55, 'click': 214, 'stow': 0}]

为何查询时的表用的是 article, article_delta

请大家再回顾一下 sphinx 增量索引更新 (https://www.u3v3.com/ar/1118), 如何实现增量更新的问题。

当我们实现增量索引更新时, 更新的部分的索引都是在article_delta中的, 通过 article, article_delta的方式, 能够一定程度上缓解索引未更新的问题,

这里只能一定程度上缓解索引未更新的问题, 如果要更好的解决这个问题, 请参考 Sphinx 被删除的索引怎么又出来啦?(https://www.u3v3.com/ar/1122)


现在, 我们已经能初步的使用python 连接sphinx 索引服务, 执行查询关键字查询的功能了。

更多的查询方式, 后续又时间我会继续更新

如果各位有问题或者建议, 请在评论中写下来, 不胜感激

right