搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
一个文档包含了安装、增量备份、扩展、api调用示例,省去了查找大量文章的时间。
搭建coreseek(sphinx+mmseg3)安装
[第一步] 先安装mmseg3
cd /var/installwget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gztar zxvf coreseek-4.1-beta.tar.gzcd coreseek-4.1-betacd mmseg-3.2.14./bootstrap./configure --prefix=/usr/local/mmseg3make && make install遇到的问题:error: cannot find input file: src/Makefile.in或者遇到其他类似error错误时...解决方案:依次执行下面的命令,我运行'aclocal'时又出现了错误,解决方案请看下文描述yum -y install libtoolaclocallibtoolize --forceautomake --add-missingautoconfautoheadermake clean
安装好'libtool'继续从'aclocal'开始执行上面提到的一串命令,执行完后再运行最开始的安装流程即可。
[第二步] 安装coreseek
##安装coreseek$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1$ sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决$ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql##如果提示mysql问题,可以查看MySQL数据源安装说明 http://www.coreseek.cn/product_install/install_on_bsd_linux/#mysql$ make && make install$ cd ..##命令行测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)$ cd testpack$ cat var/test/test.xml #此时应该正确显示中文$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all$ /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索
出现这个 xmlpipe2 support NOT compiled in. To use xmlpipe2, install missing XML libra 错误
执行以下命令:
yum -y install expat expat-devel
依次安装后,从新编译coreseek,然后再生成索引,就可以通过了。
结果如下:
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)] Copyright (c) 2007-2011, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft.conf'... index 'xml': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec displaying matches: 1. document=1, weight=1590, published=Thu Apr 1 07:20:07 2010, author_id=1 words: 1. '网络': 1 documents, 1 hits 2. '搜索': 2 documents, 5 hits
下面开始sphinx与mysql的配置
创建sphinx统计表,在coreseek_test库中执行。
CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL);
创建配置sphinx与mysql的配置文件
# vi /usr/local/coreseek/etc/csft_mysql.conf
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库#源定义source main #定义源名称{ type = mysql sql_host = localhost sql_user = root sql_pass = 123456 sql_db = coreseek_test sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company; # 更新sph_counter sql_query = SELECT * FROM hr_spider_company WHERE id( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) # 根据sph_counter纪录ID读入数据 sql_query_post_index = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company # 更新sph_counter}#index定义index main #注意与定义名称的统一性{ source = main #对应的source名称 path = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾 charset_type = zh_cn.utf-8}index delta : main #注意与定义名称的统一性{ source = delta path = /usr/local/coreseek/var/data/delta}#全局index定义indexer{ mem_limit = 128M}#searchd服务定义searchd{ listen = 9312 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = /usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = /usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... binlog_path = #关闭binlog日志}
我的测试表名为hr_spider_company,你只需要根据实际需求更改为自己的表名即可。
调用命令列表:
启动后台服务(必须开启)
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
执行索引(查询、测试前必须执行一次)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
执行增量索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate
合并索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0
(为了防止多个关键字指向同一个文档加上--merge-dst-range deleted 0 0)
后台服务测试
# /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf aaa
关闭后台服务
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop
自动化命令:
crontab -e
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 030 1 * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
以下任务计划的意思是:每隔一分钟执行一遍增量索引,每五分钟执行一遍合并索引,每天1:30执行整体索引。
Sphinx扩展安装安装
Coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek(coreseek就是sphinx!)已经进入了php的官方函数库,而且效率的提升不是一点点!但php模块依赖于libsphinxclient包。
[第一步] 安装依赖libsphinxclient
# cd /var/install/coreseek-4.1-beta/csft-4.1/api/libsphinxclient/# ./configure --prefix=/usr/local/sphinxclientconfigure: creating ./config.statusconfig.status: creating Makefileconfig.status: error: cannot find input file: Makefile.in #报错configure失败 //处理configure报错编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in这个的错误,然后运行下列指令再次编译就能通过了:# aclocal# libtoolize --force# automake --add-missing# autoconf# autoheader# make clean//从新configure编译# ./configure# make && make install
[第二步] 安装sphinx的PHP扩展
http://pecl.php.net/package/sphinx# wget http://pecl.php.net/get/sphinx-1.3.0.tgz# tar zxvf sphinx-1.3.0.tgz# cd sphinx-1.3.0# phpize# ./configure --with-php-config=/usr/bin/php-config --with-sphinx=/usr/local/sphinxclient# make && make install# cd /etc/php.d/# cp gd.ini sphinx.ini# vi sphinx.iniextension=sphinx.so# service php-fpm restart
打开phpinfo看一下是否已经支持了sphinx模块。
php调用sphinx示例:
<?php $s = new SphinxClient; $s->setServer("127.0.0.1", 9312); $s->setMatchMode(SPH_MATCH_PHRASE); $s->setMaxQueryTime(30); $res = $s->query("宝马",'main'); #[宝马]关键字,[main]数据源source $err = $s->GetLastError(); var_dump(array_keys($res['matches'])); echo "<br>"."通过获取的ID来读取数据库中的值即可。"."<br>"; echo '<pre class="brush:php;toolbar:false">'; var_dump($res); var_dump($err); echo '';
输出结果:
array(20) { [0]=> int(1513) [1]=> int(42020) [2]=> int(57512) [3]=> int(59852) [4]=> int(59855) [5]=> int(60805) [6]=> int(94444) [7]=> int(94448) [8]=> int(99229) [9]=> int(107524) [10]=> int(111918) [11]=> int(148) [12]=> int(178) [13]=> int(595) [14]=> int(775) [15]=> int(860) [16]=> int(938) [17]=> int(1048) [18]=> int(1395) [19]=> int(1657)}<br>通过获取的ID来读取数据库中的值即可。<br><pre class="brush:php;toolbar:false">array(10) { ["error"]=> string(0) "" ["warning"]=> string(0) "" ["status"]=> int(0) ["fields"]=> array(17) { [0]=> string(3) "cid" [1]=> string(8) "link_url" [2]=> string(12) "company_name" [3]=> string(9) "type_name" [4]=> string(10) "trade_name" [5]=> string(5) "scale" [6]=> string(8) "homepage" [7]=> string(7) "address" [8]=> string(9) "city_name" [9]=> string(8) "postcode" [10]=> string(7) "contact" [11]=> string(9) "telephone" [12]=> string(6) "mobile" [13]=> string(3) "fax" [14]=> string(5) "email" [15]=> string(11) "description" [16]=> string(11) "update_time" } ["attrs"]=> array(3) { ["from_id"]=> string(1) "1" ["link_id"]=> string(1) "1" ["add_time"]=> string(1) "1" } ["matches"]=> array(20) { [1513]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "3171471" ["add_time"]=> string(10) "1394853454" } } [42020]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2248093" ["add_time"]=> string(10) "1394913884" } } [57512]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2684470" ["add_time"]=> string(10) "1394970833" } } [59852]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "3" ["link_id"]=> string(1) "0" ["add_time"]=> string(10) "1394977527" } } [59855]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "3" ["link_id"]=> string(1) "0" ["add_time"]=> string(10) "1394977535" } } [60805]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "3" ["link_id"]=> string(1) "0" ["add_time"]=> string(10) "1394980072" } } [94444]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "3" ["link_id"]=> string(1) "0" ["add_time"]=> string(10) "1395084115" } } [94448]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "3" ["link_id"]=> string(1) "0" ["add_time"]=> string(10) "1395084124" } } [99229]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "1297992" ["add_time"]=> string(10) "1395100520" } } [107524]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "5" ["link_id"]=> string(10) "4294967295" ["add_time"]=> string(10) "1395122053" } } [111918]=> array(2) { ["weight"]=> int(2) ["attrs"]=> array(3) { ["from_id"]=> string(1) "5" ["link_id"]=> string(10) "4294967295" ["add_time"]=> string(10) "1395127953" } } [148]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2770294" ["add_time"]=> string(10) "1394852562" } } [178]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2474558" ["add_time"]=> string(10) "1394852579" } } [595]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(6) "534804" ["add_time"]=> string(10) "1394852862" } } [775]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "3230353" ["add_time"]=> string(10) "1394852980" } } [860]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2549233" ["add_time"]=> string(10) "1394853048" } } [938]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "3191382" ["add_time"]=> string(10) "1394853114" } } [1048]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "3234645" ["add_time"]=> string(10) "1394853174" } } [1395]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2661219" ["add_time"]=> string(10) "1394853375" } } [1657]=> array(2) { ["weight"]=> int(1) ["attrs"]=> array(3) { ["from_id"]=> string(1) "2" ["link_id"]=> string(7) "2670624" ["add_time"]=> string(10) "1394853540" } } } ["total"]=> int(543) ["total_found"]=> int(543) ["time"]=> float(0.109) ["words"]=> array(1) { ["宝马"]=> array(2) { ["docs"]=> int(543) ["hits"]=> int(741) } }}string(0) ""

使用Java的String.valueOf()函数将基本数据类型转换为字符串在Java开发中,当我们需要将基本数据类型转换为字符串时,一种常见的方法是使用String类的valueOf()函数。这个函数可以接受基本数据类型的参数,并返回对应的字符串表示。在本文中,我们将探讨如何使用String.valueOf()函数进行基本数据类型转换,并提供一些代码示例来

char数组转string的方法:可以通过赋值来实现,使用{char a[]=" abc d\0efg ";string s=a;}语法,让char数组对string直接赋值,执行代码即可完成转换。

使用Java的String.replace()函数替换字符串中的字符(串)在Java中,字符串是不可变的对象,这意味着一旦创建了一个字符串对象,就无法修改它的值。但是,你可能会遇到需要替换字符串中的某些字符或者字符串的情况。这时候,我们可以使用Java的String类中的replace()方法来实现字符串的替换。String类的replace()方法有两种重

大家好,今天给大家分享java基础知识之String。String类的重要性就不必说了,可以说是我们后端开发用的最多的类,所以,很有必要好好来聊聊它。

String中split方法使用String的split()方法用于按传入的字符或字符串对String进行拆分,返回拆分之后的数组。1、一般用法用一般的字符,例如@或,等符号做分隔符时:Stringaddress="上海@上海市@闵行区@吴中路";String[]splitAddr=address.split("@");System.out.println(splitAddr[0]+splitAddr[1]+splitAddr[2]+splitAddr[3

使用Java的String.length()函数获取字符串的长度在Java编程中,字符串是一种非常常见的数据类型,我们经常需要获取字符串的长度,即字符串中字符的个数。在Java中,我们可以使用String类的length()函数来获取字符串的长度。下面是一个简单的示例代码:publicclassStringLengthExample{publ

一、认识String1.JDK中的String首先我们看看JDK中的String类源码,它实现了很多接口,可以看到String类被final修饰了,这就说明String类不可以被继承,String不存在子类,这样所有使用JDK的人,用到的String类都是同一个,如果String允许被继承,每个人都可以对String进行扩展,每个人使用的String都不是同一个版本,两个不同的人使用相同的方法,表现出不同的结果,这就导致代码没办法进行开发了继承和方法覆写在带来灵活性的同时,也会带来很多子类行为不

String.toLowerCase()函数是Java中一个非常有用且常见的字符串处理函数,它可以将一个字符串转换为小写形式。在本文中,我们将介绍该函数的使用方法,并给出一些相关的代码示例。首先,让我们来看一下String.toLowerCase()函数的基本语法。它没有任何参数,只需要调用它即可。下面是示例代码:Stringstr="Hel


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6
視覺化網頁開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中