ในบทความนี้ เราจะเรียนรู้เกี่ยวกับวิธีการติดตั้งและตั้งค่าสฟิงซ์บน Ubuntu 16.04 สฟิงซ์เป็นเสิร์ชเอ็นจิ้นแบบโอเพ่นซอร์สที่ช่วยให้สามารถค้นหาแบบทดสอบเต็มรูปแบบได้ และดีที่สุดในการค้นหาด้วยข้อมูลขนาดใหญ่อย่างมีประสิทธิภาพโดยที่ข้อมูลสามารถมาจากที่ใด แหล่งที่มาใดก็ได้ (เช่น - ฐานข้อมูล SQL ไฟล์ข้อความธรรมดา ฯลฯ)
คุณสมบัติของสฟิงซ์
-
ดัชนีขั้นสูงและเครื่องมือที่ดีสำหรับการสืบค้น
-
ประสิทธิภาพการค้นหาและดัชนีสูง
-
ผลลัพธ์ขั้นสูงสำหรับการประมวลผลภายหลัง
-
ปรับขนาดได้อย่างง่ายดายด้วยการค้นหาขั้นสูง
-
สามารถรวมเข้ากับแหล่งที่มาของ SQL และ XML ได้
-
สามารถปรับขนาดได้สำหรับการส่งข้อมูลขนาดใหญ่ด้วยข้อความค้นหากว่า 1,000 รายการ
ข้อกำหนดเบื้องต้น
ก่อนที่เราจะเริ่มต้น เราจำเป็นต้องมีข้อกำหนดเบื้องต้นบางอย่างก่อน
-
เราต้องการเครื่อง Ubuntu ที่มีผู้ใช้ที่ไม่ใช่รูทที่มีสิทธิ์ sudo บนเครื่อง
-
ติดตั้ง MySQL บนเครื่องแล้ว
การติดตั้งสฟิงซ์บนเครื่อง
เราสามารถติดตั้ง Sphinx ได้โดยตรงโดยใช้ที่เก็บแพ็คเกจดั้งเดิมของ Ubuntu โดยใช้ apt-get ด้านล่างนี้คือคำสั่งในการติดตั้ง Sphinx
$ sudo apt-get install sphinxsearch Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: libmysqlclient20 libstemmer0d The following NEW packages will be installed: libmysqlclient20 libstemmer0d sphinxsearch 0 upgraded, 3 newly installed, 0 to remove and 92 not upgraded. Need to get 2,608 kB of archives. After this operation, 20.5 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 https://in.archive.ubuntu.com/ubuntuxenial/universe amd64 libstemmer0d amd 64 0+svn585-1 [62.1 kB] Get:2 https://in.archive.ubuntu.com/ubuntuxenial-updates/main amd64 libmysqlclie nt20 amd64 5.7.15-0ubuntu0.16.04.1 [809 kB] Get:3 https://in.archive.ubuntu.com/ubuntu xenial/universe amd64 sphinxsearch amd 64 2.2.9-1build1 [1,737 kB] Fetched 2,608 kB in 2s (986 kB/s) Selecting previously unselected package libstemmer0d:amd64. (Reading database ... 117542 files and directories currently installed.) Preparing to unpack .../libstemmer0d_0+svn585-1_amd64.deb ... Unpacking libstemmer0d:amd64 (0+svn585-1) ... Selecting previously unselected package libmysqlclient20:amd64. Preparing to unpack .../libmysqlclient20_5.7.15-0ubuntu0.16.04.1_amd64.deb ... Unpacking libmysqlclient20:amd64 (5.7.15-0ubuntu0.16.04.1) ... Selecting previously unselected package sphinxsearch. Preparing to unpack .../sphinxsearch_2.2.9-1build1_amd64.deb ... Unpacking sphinxsearch (2.2.9-1build1) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... Processing triggers for ureadahead (0.100.0-19) ... Processing triggers for systemd (229-4ubuntu4) ... Setting up libstemmer0d:amd64 (0+svn585-1) ... Setting up libmysqlclient20:amd64 (5.7.15-0ubuntu0.16.04.1) ... Setting up sphinxsearch (2.2.9-1build1) ... Adding system user `sphinxsearch' (UID 119) ... Adding new group `sphinxsearch' (GID 125) ... Adding new user `sphinxsearch' (UID 119) with group `sphinxsearch' ... Not creating home directory `/var/run/sphinxsearch'. Processing triggers for libc-bin (2.23-0ubuntu3) ... Processing triggers for ureadahead (0.100.0-19) ... Processing triggers for systemd (229-4ubuntu4) ...
การสร้างฐานข้อมูลทดสอบสำหรับสฟิงซ์
ตอนนี้ เราต้องสร้างฐานข้อมูลทดสอบหนึ่งฐานข้อมูลโดยใช้ข้อมูลตัวอย่างที่มาพร้อมกับแพ็คเกจโดยค่าเริ่มต้น ซึ่งจะช่วยให้คุณทดสอบการค้นหาสฟิงซ์ได้ในขั้นตอนต่อมา
ให้เราเข้าสู่ระบบ MySQL ซึ่งเราจะสร้างฐานข้อมูลทดสอบและนำเข้าฐานข้อมูลตัวอย่าง
$ mysql –u root –p mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> SOURCE /etc/sphinxsearch/example.sql; Query OK, 0 rows affected, 1 warning (0.01 sec) Query OK, 0 rows affected (0.03 sec) Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 10 rows affected (0.01 sec) Records: 10 Duplicates: 0 Warnings: 0 Mysql> quit
การกำหนดค่าสฟิงซ์สำหรับการค้นหา
ในสฟิงซ์ เราจำเป็นต้องแก้ไขและกำหนดค่า 3 บล็อกหลักเพื่อให้เหมาะกับสภาพแวดล้อมของเราที่มีการกำหนดดัชนีที่จำเป็น การค้นหา และแหล่งที่มา ซึ่งพบได้ในไฟล์การกำหนดค่า sphinx.conf ซึ่งอยู่ที่ /etc/sphinxsearch/sphinx conf.sample ที่เราจำเป็นต้องคัดลอกไฟล์การกำหนดค่าตัวอย่างที่มีอยู่ไปยังโฟลเดอร์ /etc/sphinxsearch
$ cp /etc/sphinxsearch/sphinx.conf.sample /etc/sphinxsearch/sphinx.conf $ sudo vi /etc/sphoxsearch/sphinx.conf
ไฟล์การกำหนดค่าควรมีลักษณะดังนี้ด้านล่างพร้อมบล็อก
ที่มาของบล็อกใน sphinx.conf
source src1 { type = mysql #SQL settings (for ‘mysql’ and ‘pgsql’ types) sql_host = localhost sql_user = roo tsql_pass = ubuntu sql_db = test sql_port = 3306 # optional, default is 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added }
ดัชนีบล็อกใน sphinx.conf
index test { source = src1 path = /var/lib/sphinxsearch/data/test docinfo = extern } Searchd block in sphinx.conf searchd { listen = 9312:sphinx #SphinxAPI port listen = 9306:mysql41 #SphinxQL port log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/testquery.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/testsearchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/datatest }
ครั้งหนึ่ง เราแก้ไขการกำหนดค่าที่จำเป็นในการสร้างดัชนีสฟิงซ์
การจัดการดัชนีบนสฟิงซ์
ที่นี่ เราจะสร้างดัชนีโดยใช้ไฟล์การกำหนดค่าที่เราแก้ไขในขั้นตอนก่อนหน้านี้
$ sudo indexer –all Sphinx 2.2.9-id64-release (rel22-r5006) Copyright (c) 2001-2015, Andrew Aksyonoff Copyright (c) 2008-2015, Sphinx Technologies Inc (https://sphinxsearch.com) using config file '/etc/sphinxsearch/sphinx.conf'... indexing index 'test'... collected 4 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 4 docs, 193 bytes total 0.007 sec, 24319 bytes/sec, 504.03 docs/sec total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
ในสภาพแวดล้อมการผลิต เราจำเป็นต้องมีดัชนีที่เป็นปัจจุบัน ดังนั้นเราจะสร้าง cronjob สำหรับสิ่งนี้ –
$ crontab –e
เพิ่มสิ่งต่อไปนี้ต่อท้ายไฟล์
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command @hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf –all
การเริ่มต้นบริการสฟิงซ์
เนื่องจากเราได้กำหนดค่าดัชนีโดยใช้ไฟล์กำหนดค่า ตอนนี้เราจำเป็นต้องแก้ไขไฟล์การกำหนดค่าสฟิงซ์ โดยค่าเริ่มต้น Sphinx daemon จะไม่เริ่มทำงาน เราจำเป็นต้องแก้ไขไฟล์ใน /etc/default/sphinxsearch
นี้$ vi /etc/default/sphinxsearch # # Settings for the sphinxsearch searchd daemon # Please read /usr/share/doc/sphinxsearch/README.Debian for details. # # Should sphinxsearch run automatically on startup? (default: no) # Before doing this you might want to modify /etc/sphinxsearch/sphinx.conf # so that it works for you. START=yes
ด้านล่างนี้เป็นคำสั่งให้ติดดาว Sphinx Daemon
$ sudo systemctl restart sphinxsearch.services
เมื่อเราเริ่มบริการ sphinxsearch ใหม่ เราจะตรวจสอบสถานะโดยใช้คำสั่งด้านล่าง
$ sudo systemctl status sphinxsearch.service sphinxsearch.service - LSB: Fast standalone full-text SQL search engine Loaded: loaded (/etc/init.d/sphinxsearch; bad; vendor preset: enabled) Active: active (exited) since Mon 2016-09-19 13:00:20 IST; 1h 10min ago Docs: man:systemd-sysv-generator(8) Tasks: 0 (limit: 512) Memory: 0B CPU: 0 Sep 19 13:00:20 ubuntu-16 systemd[1]: Starting LSB: Fast standalone full-text SQL search engine... Sep 19 13:00:20 ubuntu-16 sphinxsearch[7804]: To enable sphinxsearch, edit /etc/default/sphinxsearch and set START=ye Sep 19 13:00:20 ubuntu-16 systemd[1]: Started LSB: Fast standalone full-text SQL search engine.
ทดสอบการค้นหาสฟิงซ์
ตอนนี้เราจะเชื่อมต่อกับ SphinxQL โดยใช้พอร์ต 9306 โดยใช้อินเทอร์เฟซ MySQL
$ mysql -h0 -P9306 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 2.2.9-id64-release (rel22-r5006) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
ค้นหาคำว่า “test” ในฐานข้อมูล
mysql> SELECT * FROM test WHERE MATCH('test '); SHOW META; +------+----------+------------+ | id | group_id | date_added | +------+----------+------------+ | 1 | 1 | 1474272578 | | 2 | 1 | 1474272578 | | 4 | 2 | 1474272578 | +------+----------+------------+ 3 rows in set (0.00 sec) +---------------+-------+ | Variable_name | Value | +---------------+-------+ | total | 3 | | total_found | 3 | | time | 0.000 | | keyword[0] | test | | docs[0] | 3 | | hits[0] | 5 | +---------------+-------+ 6 rows in set (0.00 sec)
ด้วยการใช้การตั้งค่าและการกำหนดค่า เราสามารถกำหนดค่าให้สฟิงซ์เป็นเสิร์ชเอ็นจิ้นที่ทรงพลังซึ่งมีประสิทธิภาพมากกว่าและสามารถจัดการข้อมูลขนาดใหญ่ได้ การค้นหาสฟิงซ์สามารถจัดการเอกสารได้หลายพันล้านรายการและสามารถจัดการข้อมูลเทราไบต์ที่สามารถดำเนินการค้นหาพันคำต่อ วินาที.