Home > Article > Backend Development > sphinx全文检索之PHP使用课程
sphinx全文检索之PHP使用教程
以上一篇的email数据表为例:
数据结构:
01.
CREATE
TABLE
email (
02.
emailid mediumint(8) unsigned
NOT
NULL
auto_increment COMMENT
'邮件id'
,
03.
04.
fromid
int
(10) unsigned
NOT
NULL
default
'0'
COMMENT
'发送人ID'
,
05.
06.
toid
int
(10) unsigned
NOT
NULL
default
'0'
COMMENT
'收件人ID'
,
07.
content text unsigned
NOT
NULL
COMMENT
'邮件内容'
,
08.
subject
varchar
(100) unsigned
NOT
NULL
COMMENT
'邮件标题'
,
09.
10.
sendtime
int
(10)
NOT
NULL
COMMENT
'发送时间'
,
11.
12.
attachment
varchar
(100)
NOT
NULL
COMMENT
'附件ID,以逗号分割'
,
PRIMARY
KEY
(emailid),
13.
) ENGINE=MyISAM';
01.
$sphinx
=
new
SphinxClient();
02.
03.
//sphinx的主机名和端口
04.
05.
$sphinx
->SetServer (
'loclahost'
, 9312 );
06.
07.
//设置返回结果集为php数组格式
08.
09.
$sphinx
->SetArrayResult ( true );
10.
11.
//匹配结果的偏移量,参数的意义依次为:起始位置,返回结果条数,最大匹配条数
12.
13.
$sphinx
->SetLimits(0, 20, 1000);
14.
15.
//最大搜索时间
16.
17.
$sphinx
->SetMaxQueryTime(10);
18.
19.
20.
21.
//执行简单的搜索,这个搜索将会查询所有字段的信息,要查询指定的字段请继续看下文
22.
23.
$index
=
'email'
//索引源是配置文件中的 index 类,如果有多个索引源可使用,号隔开:'email,diary' 或者使用'*'号代表全部索引源
24.
25.
$result
=
$sphinx
->query (
'搜索关键字'
,
$index
);
26.
27.
echo
'
<span style="font-size:18px">'; print_r($result); echo '</span>';
01.
//emailid的范围
02.
03.
$sphinx
->SetIdRange(
$min
,
$max
);
04.
05.
06.
07.
//属性过滤,可过滤的属性必需在配置文件中设置sql_attr_ ,之前我们定义了这些
08.
09.
sql_attr_uint = fromid
10.
11.
sql_attr_uint = toid
12.
13.
sql_attr_timestamp = sendtime
14.
15.
//如果你想再次修改这些属性,配置完成后记得重新建立索引才能生效
16.
17.
18.
19.
//指定一些值
20.
21.
$sphinx
->SetFilter(
'fromid'
,
array
(1,2));
//fromid的值只能是1或者2
22.
23.
//和以上条件相反,可增加第三个参数
24.
25.
$sphinx
->SetFilter(
'fromid'
,
array
(1,2), false);
//fromid的值不能是1或者2
26.
27.
//指定一个值的范围
28.
29.
$sphinx
->SetFilterRange(
'toid'
,
5, 200);
//toid的值在5-200之间
30.
31.
//和以上条件相反,可增加第三个参数
32.
33.
$sphinx
->SetFilterRange(
'toid'
,
5, 200, false);
//toid的值在5-200以外
34.
35.
36.
37.
//执行搜索
38.
39.
$result
=
$sphinx
->query(
'关键字'
,
'*'
);
01.
//使用属性排序
02.
03.
//以fromid倒序排序,注意当再次使用SetSortMode会覆盖上一个排序
04.
05.
$sphinx
->SetSortMode (
"SPH_SORT_ATTR_DESC"
,
'fromid'
);
06.
07.
//如果要使用多个字段排序可使用SPH_SORT_EXTENDED模式
08.
09.
//@id是sphinx内置关键字,这里指emailid,至于为什么是emailid,自己思考一下
10.
11.
$sphinx
->SetSortMode (
"SPH_SORT_ATTR_DESC"
,
'fromid ASC, toid DESC, @id DESC'
);
12.
13.
//执行搜索
14.
15.
$result
=
$sphinx
->query(
'关键字'
,
'*'
);
01.
//设置扩展匹配模式
02.
03.
$sphinx
->SetMatchMode (
"SPH_MATCH_EXTENDED2"
);
04.
05.
//查询中使用条件语句,字段用@开头,搜索内容包含测试,toid等于1的邮件:
06.
07.
$result
=
$sphinx
->query(
'@content (测试) & @toid =1'
,
'*'
);
08.
09.
//用括号和&(与)、|、(或者)、-(非,即!=)设置更复杂的条件
10.
11.
$result
=
$sphinx
->query(
'(@content (测试) & @subject =呃) | (@fromid -(100))'
,
'*'
);
12.
13.
//更多语法请查看官方文档匹配模式的说明
01.
//大于等于某一时间截$time
02.
03.
$sphinx
->SetFilterRange(
'sendtime'
,
$time
, 10000000000)
//时间截最大是10个9,再加1是不可超越了。。
04.
05.
06.
07.
//大于某一时间截$time
08.
09.
$sphinx
->SetFilterRange(
'sendtime'
,
$time
+1, 10000000000)
10.
11.
//小于等于某一时间截$time
12.
13.
$sphinx
->SetFilterRange(
'sendtime'
,
-1,
$time
)
//时间截最小是0,所以应该减1
14.
15.
//大于某一时间截$time
16.
17.
$sphinx
->SetFilterRange(
'sendtime'
,
-1,
$time
- 1)
01.
//设置完成记得重新建立索引
02.
03.
04.
05.
然后PHP中可以使用SetFilter()
06.
07.
//搜索包含附件ID为1或2邮件,mysql语法是这样FIND_IN_SET(`attachment`, '1,2')
08.
09.
$sphinx
->SetFilter(
'attachment'
,
array
(1,2))
10.
11.
//可以使用SetFilterRange,搜索包含附件ID在50-100范围的邮件
12.
13.
$sphinx
->SetFilterRange(
'attachment'
,
50, 100)