本文主要給大家介紹全文檢索工具sphinx的安裝和測(cè)試,其所涉及的東西,從理論知識(shí)來(lái)獲悉,有很多書(shū)籍、文獻(xiàn)可供大家參考,從現(xiàn)實(shí)意義角度出發(fā),創(chuàng)新互聯(lián)累計(jì)多年的實(shí)踐經(jīng)驗(yàn)可分享給大家。
在成都等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,成都網(wǎng)站建設(shè)費(fèi)用合理。
導(dǎo)讀:最近在線上由于某些不可名狀的原因需要在數(shù)據(jù)庫(kù)中過(guò)濾一些詞語(yǔ),所以線上比較多的語(yǔ)句都是 select c1,c2 fron tb1 where c1 like '%name%'類(lèi)似與這個(gè)樣子的模糊查詢。開(kāi)始想到了全文索引來(lái)進(jìn)行分詞,但是又想到這些都是線上數(shù)據(jù)庫(kù),并且表中的數(shù)據(jù)都是幾千萬(wàn)行的數(shù)據(jù),在線online ddl 或者說(shuō)使用第三方的工具的話對(duì)于在修改期間會(huì)阻塞線上的DML操作,并且針對(duì)全文索引的維護(hù)也需要消耗一定的資源,所以暫時(shí)打消了這個(gè)想法。在和開(kāi)發(fā)進(jìn)行討論并且結(jié)合實(shí)際業(yè)務(wù),最后還是打算選型第三方的全文檢索工具,在這里選擇了全文檢索工具sphinx。
sphinx的安裝和測(cè)試:
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 = 3306 # optional, default is 3306
sql_query = \
SELECT userid as id, \
k, \
c, \
pad \
FROM sbtest1 \
where c like '%03679578678%' \
sql_attr_uint = k #數(shù)據(jù)類(lèi)型int或者timestamp
sql_field_string = c #數(shù)據(jù)類(lèi)型text或者string
sql_attr_string = pad #數(shù)據(jù)類(lèi)型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 #對(duì)外提供服務(wù)的端口,類(lèi)似與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參數(shù)后面是sql語(yǔ)句,但是這個(gè)sql語(yǔ)句的第一個(gè)字段必須是id字段,在后面的參數(shù)類(lèi)型定義的時(shí)候不需要定義,否則的話sphinx是不能識(shí)別這個(gè)屬性的。
b. 在屬性的定義的時(shí)候必須包含一個(gè)sql_filed_string類(lèi)型的字段,否則sphinx認(rèn)為你沒(méi)有必須使用全文檢索這個(gè)功能。
3.創(chuàng)建索引
indexer sbtest1
4.啟動(dòng)searchd 服務(wù)
service searchd start
5.查看searchd服務(wù)狀態(tài)
[root@TiDB-node2 data]# searchd --status
Sphinx 2.3.2-id64-beta (4409612)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinx/sphinx.conf'...
searchd status
--------------
uptime: 80403
connections: 11
maxed_out: 0
command_search: 7
command_excerpt: 0
command_update: 0
command_delete: 0
command_keywords: 0
command_persist: 0
command_status: 1
command_flushattrs: 0
agent_connect: 0
agent_retry: 0
queries: 7
dist_queries: 0
query_wall: 0.010
query_cpu: OFF
dist_wall: 0.000
dist_local: 0.000
dist_wait: 0.000
query_reads: OFF
query_readkb: OFF
query_readtime: OFF
avg_query_wall: 0.001
avg_query_cpu: OFF
avg_dist_wall: 0.000
avg_dist_local: 0.000
avg_dist_wait: 0.000
avg_query_reads: OFF
avg_query_readkb: OFF
avg_query_readtime: OFF
qcache_max_bytes: 16777216
qcache_thresh_msec: 3000
qcache_ttl_sec: 60
qcache_cached_queries: 0
qcache_used_bytes: 0
qcache_hits: 0
6.測(cè)試使用: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測(cè)試使用
#!/usr/bin/env python
#coding:utf-8
import pymysql
con = 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.表結(jié)構(gòu):
root@mysqldb 18:06: [sbtest]> show create table sbtest1 \G
*************************** 1. row ***************************
Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=25000000 DEFAULT CHARSET=utf8mb4
測(cè)試環(huán)境中表sbtest1的數(shù)據(jù)有2500萬(wàn)行,測(cè)試sql是select * from sbtest1 where c like '%03679578678%'。在MySQL執(zhí)行這個(gè)sql的時(shí)候由于使用不了索引只能進(jìn)行全表掃描,花費(fèi)了將近4分鐘,但是在sphinx創(chuàng)建索引的時(shí)候也花費(fèi)了70多秒的樣子。在索引創(chuàng)建成功之后基本上面執(zhí)行python腳本或者使用mysql客戶端獲取得到的花費(fèi)基本是在毫秒級(jí)別的。性能提升了很多,并且sphinx和MySQL的在創(chuàng)建索引成功之后之間就沒(méi)有鏈接了。并不會(huì)影響MySQL的操作,sphinx可以獨(dú)立部署到一臺(tái)云服務(wù)器上面。
9.更新索引文件:增量更新索引文件
indexer --rotate test1
看了以上全文檢索工具sphinx的安裝和測(cè)試介紹,希望能給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助。本文由于篇幅有限,難免會(huì)有不足和需要補(bǔ)充的地方,大家可以繼續(xù)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊板塊,會(huì)定期給大家更新行業(yè)新聞和知識(shí),如有需要更加專(zhuān)業(yè)的解答,可在官網(wǎng)聯(lián)系我們的24小時(shí)售前售后,隨時(shí)幫您解答問(wèn)題的。