Mac下安装sphinx & 使用Python实现简单查询
2017-02-26
场景
在我过去的博客中, 我写过一个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 索引服务, 执行查询关键字查询的功能了。
更多的查询方式, 后续又时间我会继续更新
如果各位有问题或者建议, 请在评论中写下来, 不胜感激