本机网络ip做网站,wordpress主题显示不出来,康乐县网站建设,网站开发后端语言由于项目需要全文检索#xff0c;后面就去网上查了下资料#xff0c;找到了Sphinx【中文是狮身人面像】这个全文检索引擎#xff0c;听说挺好用的#xff0c;不过没有中文分词。后面又去找了一下#xff0c;找到了Coreseek#xff0c;一款中文全文检索/搜索软件。 一、Sp… 由于项目需要全文检索后面就去网上查了下资料找到了Sphinx【中文是狮身人面像】这个全文检索引擎听说挺好用的不过没有中文分词。后面又去找了一下找到了Coreseek一款中文全文检索/搜索软件。 一、Sphinx PHP扩展下载 PHP已经有专门的Sphinx的扩展文件点击这里可以下载到不同版本的扩展。 扩展安装成功后就能看到sphinx信息了。 也可以通过引用一个php类文件达到同样的效果文件是在api文件夹下面的sphinxapi.php。这个更好用点在调试的时候发现如果是直接引用的那个dll有时候会报方法不存在但是明明在PHP:Sphinx的API说明里面是有的。 二、安装Coreseek 1 我这边下载了4.1的版本。按照网站上面写的过程我在本地布了一下。 这个local目录其实可以自己随便建立这里建的我感觉好深打dos命令的时候挺麻烦的。 2 打开下载下来的压缩包etc里面有很多conf的配置文件。 在var\test文件里有个documents.sql的文件这一个demo数据库等下就会用这个做测试。 3 把etc中的csft_mysql.conf文件复制到bin中并改名为sphinx.conf。 因为我的全文检索需要配合MySQL数据库所以需要配置这个文件。 4 修改配置文件刚开始配置文件没设置好老会报错。 #MySQL数据源配置详情请查看http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库并配置好以下的MySQL用户密码数据库#源定义
source mysql
{type mysqlsql_host localhostsql_user rootsql_pass 123456sql_db sphinxsql_port 3306sql_query_pre SET NAMES utf8sql_query SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents#sql_query第一列id需为整数#title、content作为字符串/文本字段被全文索引sql_attr_uint group_id #从SQL读取到的值必须为整数sql_attr_timestamp date_added #从SQL读取到的值必须为整数作为时间属性sql_query_info_pre SET NAMES utf8 #命令行查询时设置正确的字符集sql_query_info SELECT * FROM documents WHERE id$id #命令行查询时从数据库读取原始数据信息
}#index定义
index mysql
{source mysql #对应的source名称path C:/usr/local/coreseek-4.1-win32/var/data/documents #请修改为实际使用的绝对路径例如/usr/local/coreseek/var/...docinfo externmlock 0morphology nonemin_word_len 1html_strip 0#中文分词配置详情请查看http://www.coreseek.cn/products-install/coreseek_mmseg/#charset_dictpath /usr/local/mmseg3/etc/ #BSD、Linux环境下设置/符号结尾charset_dictpath C:/usr/local/coreseek-4.1-win32/etc/ #Windows环境下设置/符号结尾最好给出绝对路径例如C:/usr/local/coreseek/etc/...charset_type zh_cn.utf-8
}#全局index定义
indexer
{mem_limit 128M
}#searchd服务定义
searchd
{compat_sphinxql_magics 0listen 9312read_timeout 5max_children 30max_matches 1000seamless_rotate 0preopen_indexes 0unlink_old 1pid_file C:/usr/local/coreseek-4.1-win32/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径例如/usr/local/coreseek/var/...log C:/usr/local/coreseek-4.1-win32/var/log/searchd_mysql.log #请修改为实际使用的绝对路径例如/usr/local/coreseek/var/...query_log C:/usr/local/coreseek-4.1-win32/var/log/query_mysql.log #请修改为实际使用的绝对路径例如/usr/local/coreseek/var/...binlog_path #关闭binlog日志
} 5 建立索引打一句dos命令就行。 在#index定义中设置了path的路径在这个路径里面能够看到索引文件。 6 打开控制台让Sphinx监听端口接收搜索命令。 searchd 可以安装成一个Windows服务命令如下 C:\usr\local\coreseek C:\usr\local\coreseek\bin\searchd.exe --install --config C:\usr\local\coreseek\etc\coreseek.conf --servicename Coreseek 这样 searchd 服务应该出现在“控制面板-系统管理-服务”的列表中了. 服务应该出现在“控制面板-系统管理-服务”的列表中了。 删除服务的命令如下 sc delete Coreseek 三、PHP代码测试 ?php
header(Content-Type: text/html; charsetutf-8);//防止中文显示为乱码
$s new SphinxClient;//已经引入扩展所以不需要额外require文件了
$s-setServer(127.0.0.1, 9312);
$s-setMatchMode(SPH_MATCH_PHRASE);
$s-setMaxQueryTime(30); $res $s-query(愚人, mysql); #[愚人]关键字[mysql]数据源source
$err $s-GetLastError(); echo pre;
var_dump($res);
var_dump($err);
echo /pre; 查看到结果 与数据库比对一下可以看到搜索出了第一条的数据。 四、计算经纬度 现在时髦的APP客户端基本上都会涉及到一个功能就是寻找附近的XX在我们服务端就是需要计算经纬度距离了。原先我们的做法是在MySQL中自定义一个计算两个经纬度点距离的函数在做查询的时候调用现在用Coreseek可以直接调用一个方法SetGeoAnchor。 先看看Coreseek中对这个方法的说明 原型 function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )为地理距离计算设置锚点并且允许使用它们。$attrlat 和 $attrlong是字符串分别指定了对应经度和纬度的属性名称。$lat 和 $long是浮点值指定了锚点的经度和纬度值以角度为单位。 再看看sphinx中API的说明 Prototype: function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )Sets anchor point for and geosphere distance (geodistance) calculations, and enable them.$attrlat and $attrlong must be strings that contain the names of latitude and longitude attributes, respectively. $lat and $long are floats that specify anchor point latitude and longitude, in radians. 原文说的$lat 和 $long这两个其实是弧度而不是翻译的角度。 1在做索引的时候 将经纬度数据源转换成弧度。 radians是MySQL中由度转化为弧度的函数。 sql_query SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content, radians(longtitude) as longtitude, radians(latitude) as latitude FROM documents order by id desc 2PHP中引用方法并可做过滤与排序deg2rad函数将角度转换为弧度。 $lon 121;
$lat 31;
$s-SetGeoAnchor(latitude, longtitude, (float)deg2rad($lat), (float) deg2rad($lon));
$s-SetSortMode(SPH_SORT_EXTENDED, geodist asc); // 按距离正向排序
//$s-SetFilterFloatRange(geodist, 0.0, $radius); // 过滤掉大于10公里的地点 3查看页面结果距离大约为49749同时我用以前的那个MySQL自定义函数在数据库中跑了一下距离是49704两个结果差不多。