/ XunSearch

迅搜XunSearch使用小记

国庆放假无聊至极,想找点东西来玩玩,于是就盯上了全文搜索,在OSC上看了看,决定支持下国产,采用迅搜。

迅搜的安装还是很简单的,按照指南很快就装好了,这里不多说。

先看下表结构,这里只保留了和搜索相关的字段:

CREATE TABLE IF NOT EXISTS project ( project_id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', title varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '标题', keywords varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '关键字', description varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '简介', content longtext CHARACTER SET utf8 NOT NULL COMMENT '内容', city varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '发起城市', city_custom varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '自定义地址信息', status tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(1-草稿[默认],2-审核,3-上线中,4-成功,5-失败)', uid int(11) NOT NULL COMMENT '发起者id', PRIMARY KEY (project_id) )

希望实现的搜索效果是同时检索“标题”、“关键字”、“简介”、“内容”、“城市”、“自定义地址”,或者用户名包含关键字的用户所发起的项目,并且要求搜索出来的结果只包含status>=3的项目。

前面的要求比较简单,参照迅搜官网上对discuz论坛帖子的配置可以很容易写出来

project.name = test project.default_charset = utf-8 server.index = 8383 server.search = 8384 [project_id] type = id [title] type = title [keywords] type = string index = both weight = 4 [description] type = string index = both weight = 3 [content] type = body [city] type = string index = both [city_custom] type = string index = both [status] type = string index = self

将配置保存到sdk/php/app/test.ini文件中。

然后在sdk/php/util文件下执行如下命令

php -f Indexer.php -- --project=test --source=mysql://root:root@127.0.0.1/testdb/project

其中project参数是用来指定我们刚刚创建的索引库,也就是上方配置文件中project.name的值。

source参数是数据源,如果数据源中包含了表名(project),默认就会为整个表建立索引。

但是这样会有两个问题:1.每次搜索都必须要用setRange方法去限定status的范围。2.无法直接搜索出用户名包含关键词的用户所发起的项目。

认真看了一下Indexer.php的help信息,发现有一个sql参数,可以通过自定义的sql来构建索引,也就是说在sql中写where status>=3以及join user表来解决上述两个问题。

于是重建下索引:

php -f Indexer.php -- --project=test --source=mysql://root:root@127.0.0.1/testdb --sql='select project_id,title,keywords,project.description,content,city,city_custom,uname from project left join user on project.uid=user.uid where project.status>2' --rebuild

其中rebuild参数就是重建索引的意思;因为这回我们是通过sql构建索引,所以就不需要在source中指定表名了。

同时我们需要更新下配置文件,把[status]段去掉,增加uname段

[uname] type = string index = both

这样就全部OK了,可以通过sdk里面自带的Quest.php来测试搜索,也可以自己在php代码中包含XS.php,然后调用API来实现查询。

迅搜XunSearch使用小记
Share this