温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

全文检索工具sphinx的安装和测试

发布时间:2020-04-23 14:02:00 阅读:365 作者:三月 栏目:MySQL数据库
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

本文主要给大家介绍全文检索工具sphinx的安装和测试,其所涉及的东西,从理论知识来获悉,有很多书籍、文献可供大家参考,从现实意义角度出发,亿速云累计多年的实践经验可分享给大家。  

导读:最近在线上由于某些不可名状的原因需要在数据库中过滤一些词语,所以线上比较多的语句都是 select c1,c2 fron tb1 where c1 like '%name%'类似与这个样子的模糊查询。开始想到了全文索引来进行分词,但是又想到这些都是线上数据库,并且表中的数据都是几千万行的数据,在线online ddl 或者说使用第三方的工具的话对于在修改期间会阻塞线上的DML操作,并且针对全文索引的维护也需要消耗一定的资源,所以暂时打消了这个想法。在和开发进行讨论并且结合实际业务,最后还是打算选型第三方的全文检索工具,在这里选择了全文检索工具sphinx。

全文检索工具sphinx的安装和测试

    sphinx的安装和测试:

  1. sphinx的安装

yum install sphinx -y

  2. 配置文件

## Minimal Sphinx configuration sample (clean, simple, functional)#source sbtest_sbtest1{	type			= mysql	sql_host		= localhost 	sql_user		= root	sql_pass		= redhat	sql_db			= sbtest	sql_port		= 3306optionaldefault is 3306	sql_query		= \		SELECT userid as  id, \                k, \                c, \                pad \		FROM sbtest1 \                where c like '%03679578678%' \	sql_attr_uint   	= k  #数据类型int或者timestamp        sql_field_string         = c  #数据类型text或者string        sql_attr_string         = pad #数据类型string}index sbtest1{	source			= sbtest_sbtest1	path			= /var/lib/sphinx/sbtest1 #索引文件的路径}index testrt{	type			= rt	rt_mem_limit		= 128M	path			= /var/lib/sphinx/testrt	rt_field		= title	rt_field		= content	rt_attr_uint		= gid}indexer{	mem_limit		= 128M}searchd{	listen			= 9312 	listen			= 9306:mysql41    #对外提供服务的端口,类似与mysql中的3306端口	log			= /var/log/sphinx/searchd.log	query_log		= /var/log/sphinx/query.log	read_timeout		= 5	max_children		= 30	pid_file		= /var/run/sphinx/searchd.pid	seamless_rotate		= 1	preopen_indexes		= 1	unlink_old		= 1	workers			= threads # for RT to work	binlog_path		= /var/lib/sphinx/}

    注意:在配置文件中需要注意的是:

    a. 在sql_query参数后面是sql语句,但是这个sql语句的第一个字段必须是id字段,在后面的参数类型定义的时候不需要定义,否则的话sphinx是不能识别这个属性的。

    b. 在属性的定义的时候必须包含一个sql_filed_string类型的字段,否则sphinx认为你没有必须使用全文检索这个功能。

  3.创建索引

indexer sbtest1

  4.启动searchd 服务

service searchd start

  5.查看searchd服务状态

[root@TiDB-node2 data]# searchd --statusSphinx 2.3.2-id64-beta (4409612)Copyright (c) 2001-2016, Andrew AksyonoffCopyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)using config file '/etc/sphinx/sphinx.conf'...searchd status--------------uptime: 80403connections: 11maxed_out: 0command_search: 7command_excerpt: 0command_update: 0command_delete: 0command_keywords: 0command_persist: 0command_status: 1command_flushattrs: 0agent_connect: 0agent_retry: 0queries: 7dist_queries: 0query_wall: 0.010query_cpu: OFFdist_wall: 0.000dist_local: 0.000dist_wait: 0.000query_reads: OFFquery_readkb: OFFquery_readtime: OFFavg_query_wall: 0.001avg_query_cpu: OFFavg_dist_wall: 0.000avg_dist_local: 0.000avg_dist_wait: 0.000avg_query_reads: OFFavg_query_readkb: OFFavg_query_readtime: OFFqcache_max_bytes: 16777216qcache_thresh_msec: 3000qcache_ttl_sec: 60qcache_cached_queries: 0qcache_used_bytes: 0qcache_hits: 0

  6.测试使用:mysql 客户端

[root@TiDB-node2 data]# mysql -uroot -predhat -h327.0.0.1 -P9306 -e "select id,k,c,pad from sbtest1 where match('03679578678')"mysql: [Warning] Using a password on the command line interface can be insecure.+------+----------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+| id   | k        | c                                                                                                                       | pad                                                         |+------+----------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+|    1 | 15324329 | 64733237507-56788752464-03679578678-53343296505-31167207241-10603050901-64148678956-82738243332-73912678420-24566188603 | 78326593386-76411244360-77646817949-14319822046-41963083322 |+------+----------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+

  7.python测试使用

#!/usr/bin/env python#coding:utf-8import pymysqlcon = pymysql.connect(host='127.0.0.1', port=9306, user="", passwd="", db="")with con.cursor(pymysql.cursors.DictCursor) as cur:    cur.execute("select * from sbtest1 where match('%03679578678%')")    print(cur.fetchall())    [root@TiDB-node2 ~]# python sphinx.py[{u'c''64733237507-56788752464-03679578678-53343296505-31167207241-10603050901-64148678956-82738243332-73912678420-24566188603', u'k'15324329, u'pad''78326593386-76411244360-77646817949-14319822046-41963083322', u'id'1}]

  8.表结构:

root@mysqldb 18:06:  [sbtest]> show create table sbtest1 \G*************************** 1. row ***************************       Table: sbtest1Create TableCREATE TABLE `sbtest1` (  `id` int(11NOT NULL AUTO_INCREMENT,  `k` int(11NOT NULL DEFAULT '0',  `c` char(120NOT NULL DEFAULT '',  `pad` char(60NOT NULL DEFAULT '',  PRIMARY KEY (`id`),  KEY `k_1` (`k`)) ENGINE=InnoDB AUTO_INCREMENT=25000000 DEFAULT CHARSET=utf8mb4

    测试环境中表sbtest1的数据有2500万行,测试sql是select * from sbtest1 where c like '%03679578678%'。在MySQL执行这个sql的时候由于使用不了索引只能进行全表扫描,花费了将近4分钟,但是在sphinx创建索引的时候也花费了70多秒的样子。在索引创建成功之后基本上面执行python脚本或者使用mysql客户端获取得到的花费基本是在毫秒级别的。性能提升了很多,并且sphinx和MySQL的在创建索引成功之后之间就没有链接了。并不会影响MySQL的操作,sphinx可以独立部署到一台云服务器上面。

  9.更新索引文件:增量更新索引文件

indexer --rotate test1

看了以上全文检索工具sphinx的安装和测试介绍,希望能给大家在实际运用中带来一定的帮助。本文由于篇幅有限,难免会有不足和需要补充的地方,大家可以继续关注亿速云行业资讯板块,会定期给大家更新行业新闻和知识,如有需要更加专业的解答,可在官网联系我们的24小时售前售后,随时帮您解答问题的。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×