sphinx的简单实例

时间:2022-12-17 19:36:34

sphinx.conf中的配置:

 1 source indexLocation
2 {
3 type = mysql
4
5 sql_host = 192.168.1.113
6 sql_user = root
7 sql_pass = redidai@@2013
8 sql_db = redidai
9 sql_port = 3306 # optional, default is 3306
10
11 sql_query_pre = SET NAMES utf8
12 sql_query_pre = SET SESSION query_cache_type=OFF
13
14 sql_query = \
15 SELECT a.location_id as id,a.location_id,a.location_name as `location_name`,a.location_name as `name`,a.location_bname,a.attach_id,a.showstatus,a.is_del,a.status,b.area_name as city_name FROM `ts_rdd_location` a LEFT JOIN `ts_rdd_area` b ON a.city_id = b.area_id
16 #sql_attr_string = name
17 sql_attr_uint = status
18 #sql_attr_timestamp = date_added
19 sql_query_info = SELECT * FROM `ts_rdd_location` WHERE location_id = $id
20 }
21
22
23 index indexLocation
24 {
25 source = indexLocation
26 path = /var/lib/sphinx/test1
27 docinfo = extern
28 mlock = 0 #缓存数据内存锁定
29 morphology = none #形态学(对中文无效)
30 min_word_len = 2 #索引的词最小长度
31 charset_type = utf-8
32 min_prefix_len = 0 #最小前缀
33 html_strip = 1
34 ngram_len = 1 #对于非字母型数据的长度切割
35 ngram_chars = U+3000..U+2FA1F #则会对每个中文,英文字词进行分割,速度会慢
36
37 #字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,即进行字索引。
38 #若要使用中文分词,必须使用其他分词插件如 coreseek,sfc
39 charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
40 }
41
42
43
44
45 indexer
46 {
47 mem_limit = 32M
48 }
49
50
51 searchd
52 {
53 listen = 9312
54 #listen = 9306:mysql41
55 log = /var/log/sphinx/searchd.log
56 query_log = /var/log/sphinx/query.log
57 read_timeout = 5
58 max_children = 30
59 pid_file = /var/run/sphinx/searchd.pid
60 max_matches = 1000
61 seamless_rotate = 1
62 preopen_indexes = 1
63 unlink_old = 1
64 compat_sphinxql_magics = 0
65 #workers = threads # for RT to work
66 binlog_path = /var/lib/sphinx
67 }

php代码:

 1 <?php
2 class SearchAction extends AdministratorAction {
3
4 public $sphinxClient = null;
5
6 public function __construct() {
7 parent::__construct();
8
9 require_once SITE_PATH . '/sphinxapi.php';
10
11 if ($this->sphinxClient == null) {
12 $this->sphinxClient = new SphinxClient ();
13 }
14
15 $this->sphinxClient->SetServer('192.168.0.0', 9312);
16 $this->sphinxClient->open();
17 }
18
19 public function QLocation($params = array()) {
20 $searchWord = '';
21
22 if (isset($params['keyword'])) {
23 $searchWord = $params['keyword'];
24 }
25
26 $result = $this->suggestHandle($this->sphinxClient, $searchWord);
27
28 $nodeResult = array();
29
30 if ($result['total'] > 0) {
31 $matches = array();
32
33 foreach($result['matches'] as $mvale) {
34 $matches[] = $mvale['id'];
35 }
36
37 $matches_id = implode(",", $matches);
38
39 $locationModel = D('RddLocation', 'admin');
40 $list = $locationModel->getLocationListByID($matches_id);
41 $nodeResult = $list;
42 }
43
44 print_r($nodeResult);exit;
45
46 return $nodeResult;
47 }
48
49 public function suggestHandle($spx, $searchWord = ''){
50 //$spx->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC, larea DESC, is_recommend DESC, like_count DESC");
51 $spx->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC");
52 $spx->ResetFilters();
53 //$cityId = filter_input(INPUT_GET, 'area', FILTER_SANITIZE_STRING);
54 //$spx->SetFilter('showstatus', array('Y'));
55 //$spx->SetFilter('is_del', array('0'));
56 $spx->SetFilter('status', array(1));
57 //$result = $spx->Query($searchWord, 'plan14_location,delta_plan14_location');
58 $spx->SetArrayResult(true);
59 $result = $spx->Query($searchWord, 'indexLocation');
60 //var_dump($spx);
61 return $result;
62 }
63
64 }

调用:

$searchAction = new SearchAction();
$list = $searchAction->QLocation(array('keyword' => $name));