`
dcj3sjt126com
  • 浏览: 1871321 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sphinx实践

阅读更多

 

安装参考地址:http://briansnelson.com/How_to_install_Sphinx_on_Centos_Server

 

yum install sphinx

如果失败的话使用下面的方式安装

wget http://sphinxsearch.com/files/sphinx-2.2.9-1.rhel6.x86_64.rpm

yum localinstall sphinx-2.2.9-1.rhel6.x86_64.rpm

 

安装完了出现下面的内容

Sphinx installed!

Now create a full-text index, start the search daemon, and you're all set.

 

To manage indexes:

    editor /etc/sphinx/sphinx.conf

 

To rebuild all disk indexes:

    sudo -u sphinx indexer --all --rotate

 

To start/stop search daemon:

    service searchd start/stop

 

To query search daemon using MySQL client:

    mysql -h 0 -P 9306

    mysql> SELECT * FROM test1 WHERE MATCH('test');

 

See the manual at /usr/share/doc/sphinx-2.0.9 for details.

 

For commercial support please contact Sphinx Technologies Inc at

http://sphinxsearch.com/contacts.html

 

  Verifying  : postgresql-libs-8.4.20-2.el6_6.x86_64                                                                                                                             1/2 

  Verifying  : sphinx-2.0.9-1.rhel6.x86_64                                                                                                                                       2/2 

 

Installed:

  sphinx.x86_64 0:2.0.9-1.rhel6                                                                                                                                                      

 

Dependency Installed:

  postgresql-libs.x86_64 0:8.4.20-2.el6_6                                                                                                                                            

 

Complete!

 

安装完了之后, 现在要创建一个全文索引, 并且开启搜索的守护进程, 然后要设置

 

启动服务

service searchd start

or

/etc/init.d/searchd start

 

设置开机自启动

chkconfig searchd on

chkconfig --list searchd

 

配置实例, 先新建一个mysql的数据表

blog.sphinx_article

 

CREATE TABLE `sphinx_article` (

`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,

`title` varchar(255) NULL,

`cat_id` tinyint(3) UNSIGNED NULL,

`member_id` int(11) UNSIGNED NULL,

`content` longtext NULL,

`created` int(11) UNSIGNED NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

 

配置文件

vim /etc/sphinx/sphinx.conf

~~~

#

# Minimal Sphinx configuration sample (clean, simple, functional)

#

 

##索引源##

source article_src

{

        type                    = mysql ##数据源类型

 

        sql_host                = rdsnnamnbnnamnbprivate.mysql.rds.aliyuncs.com ##mysql主机

        sql_user                = maxwelldu ##mysql 用户名

        sql_pass                = yu13jiu14 ##mysql密码

        sql_db                  = blog  ##mysql数据库名

        sql_port                = 3306  ##mysql端口 

        sql_query_pre           = SET NAMES UTF8 ##mysql检索编码

 

        sql_query               = SELECT id, title, cat_id, member_id, content, created FROM sphinx_article ##获取数据的sql

 

        ##过滤或条件查询的属性##

        sql_attr_uint           = cat_id

        sql_attr_uint           = member_id

        sql_attr_timestamp      = created

 

        sql_query_info          = SELECT * FROM sphinx_article WHERE id=$id

}

 

##索引

index article

{

        source                  = article_src ##声明索引源

        path                    = /var/lib/sphinx/article ##索引文件存放路径及索引的文件名

        docinfo                 = extern ##文档信息存储方式

        mlock                   = 0 ##缓存数据内存锁定

        morphology              = none ##形态学(对中文无效)

        min_word_len            = 1 ##索引的词最小长度

        charset_type            = utf-8 ##数据编码

        min_prefix_len          = 0

        min_infix_len           = 1

        ngram_len               = 1

}

 

 

index testrt

{

        type                    = rt

        rt_mem_limit            = 32M

 

        path                    = /var/lib/sphinx/testrt

        charset_type            = utf-8

 

        rt_field                = title

        rt_field                = content

        rt_attr_uint            = gid

}

 

 

indexer

{

        mem_limit               = 128M

}

 

searchd

{

        listen                  = 9312

        listen                  = 9306:mysql41

        log                     = /var/log/sphinx/searchd.log

        query_log               = /var/log/sphinx/query.log

        read_timeout            = 5

        max_children            = 30

        pid_file                = /var/run/sphinx/searchd.pid

        max_matches             = 1000

        seamless_rotate         = 1

        preopen_indexes         = 1

        unlink_old              = 1

        workers                 = threads # for RT to work

        binlog_path             = /var/lib/sphinx/

}

     

~~~

 

建立索引文件

indexer -c /etc/sphinx/sphinx.conf article

CLI上测试

search -c /etc/sphinx/sphinx.conf asdf

php测试

<?php

$keyword = $_GET['keyword'];

$s = new SphinxClient;

$s->setServer("localhost", 9312);

$s->setMatchMode(SPH_MATCH_EXTENDED);

$s->setMaxQueryTime(3);

 

$result = $s->query($keyword, "article");

 

echo '<pre>';

print_r($result);

echo '</pre>';

?>

 

访问测试地址: http://123.56.135.230/sphinx.php?keyword=dfsa

 

如果还没有安装pshinx client php扩展的话先安装扩展

 

参考地址: http://linux008.blog.51cto.com/2837805/622171

安装sphinx php扩展

cd /usr/local/src/

wget http://sphinxsearch.com/files/sphinx-2.2.9-release.tar.gz

tar zxf sphinx-2.2.9-release.tar.gz

cd sphinx-2.2.9-release/api/libsphinxclient/

 

 

安装sphinx扩展

cd /usr/local/src

wget http://sphinxsearch.com/files/sphinx-2.2.9-release.tar.gz

tar zxf sphinx-2.2.9-release.tar.gz 

cd sphinx-2.2.9-release/api/libsphinxclient/

vim sphinxclient.c

./configure --prefix=/usr/local/sphinxclient

make

make install

cd /tmp/

wget http://pecl.php.net/get/sphinx-1.0.4.tgz

tar zxf sphinx-1.0.4.tgz 

cd sphinx-1.0.4

/alidata/server/php/bin/phpize 

./configure --with-php-config=/alidata/server/php/bin/php-config --with-sphinx=/usr/local/sphinxclient

make && make install

 

报错信息:

/tmp/sphinx-1.0.4/sphinx.c: In function ‘php_sphinx_client_read_property’:

/tmp/sphinx-1.0.4/sphinx.c:105: error: too few arguments to function ‘std_hnd->read_property’

/tmp/sphinx-1.0.4/sphinx.c: In function ‘zim_SphinxClient_setRankingMode’:

/tmp/sphinx-1.0.4/sphinx.c:767: error: too few arguments to function ‘sphinx_set_ranking_mode’

/tmp/sphinx-1.0.4/sphinx.c: In function ‘zm_startup_sphinx’:

/tmp/sphinx-1.0.4/sphinx.c:1786: warning: assignment from incompatible pointer type

make: *** [sphinx.lo] Error 1

 

报错解决方案参考地址: http://www.cnblogs.com/yun007/p/3802363.html 

retval = std_hnd->read_property(object, member, type TSRMLS_CC);

将这个函数最后添加一个参数NULL

retval = std_hnd->read_property(object, member, type TSRMLS_CC, NULL);

 

res = sphinx_set_ranking_mode(c->sphinx, (int)ranker);

最后加一个参数NULL

res = sphinx_set_ranking_mode(c->sphinx, (int)ranker, NULL);

 

make && make install

 

扩展安装好了之后修改php.ini, 然后重启php-fpm即可

vim /alidata/server/php/etc/php.ini

最后添加一行

extension=sphinx.so

 

重启

/etc/init.d/php-fpm restart

 

测试

 http://123.56.135.230/sphinx.php?keyword=dfsa

 

到现在为止还不能搜索中文, 参考地址: http://www.cnblogs.com/gaoxu387/archive/2012/12/05/2803183.html

cd /tmp

wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz

tar zxf coreseek-3.2.14.tar.gz

cd coreseek-3.2.14

 

安装mmseg中文分词

cd mmseg-3.2.14

./bootstrap    #输出的warning信息可以忽略,如果出现error则需要解决

./configure --prefix=/usr/local/mmseg3

make && make install

cd ..

##安装coreseek

cd csft-3.2.14

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数据源安装说明

make  ## 报错, 错误参考地址: http://blog.csdn.net/carzyer/article/details/6566351

vim src/MakeFile

LIBS = -lodbc -lm -lz -lexpat -L/usr/local/lib -lrt  -lpthread

修改为

LIBS = -lodbc -lm -lz -lexpat -liconv  -L/usr/local/lib -lrt  -lpthread

 

make install

cd ..

 

配置mysql数据源

cd /usr/local/coreseek

cp /etc/sphinx/sphinx.conf etc/csft.conf

vim /etc/csft.conf

~~~

#

# Minimal Sphinx configuration sample (clean, simple, functional)

#

 

##索引源##

source article_src

{

        type                    = mysql ##数据源类型

 

        sql_host                = rdsnnamnbnnamnbprivate.mysql.rds.aliyuncs.com ##mysql主机

        sql_user                = maxwelldu ##mysql 用户名

        sql_pass                = yu13jiu14 ##mysql密码

        sql_db                  = blog  ##mysql数据库名

        sql_port                = 3306  ##mysql端口 

        sql_query_pre           = SET NAMES UTF8 ##mysql检索编码

 

        sql_query               = SELECT id, title, cat_id, member_id, content, created FROM sphinx_article ##获取数据的sql

 

        ##过滤或条件查询的属性##

        sql_attr_uint           = cat_id

        sql_attr_uint           = member_id

        sql_attr_timestamp      = created

 

        sql_query_info          = SELECT * FROM sphinx_article WHERE id=$id

        sql_query_info_pre      = SET NAMES utf8

}

 

##索引

index article

{

        source                  = article_src ##声明索引源

        path                    = /usr/local/coreseek/var/data/article ##索引文件存放路径及索引的文件名

        docinfo                 = extern ##文档信息存储方式

        mlock                   = 0 ##缓存数据内存锁定

        morphology              = none ##形态学(对中文无效)

        min_word_len            = 1 ##索引的词最小长度

        charset_type            = zh_cn.utf-8 ##数据编码

        charset_dictpath        = /usr/local/mmseg3/etc/

}

 

indexer

{

        mem_limit               = 128M

}

 

 

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_article.pid

        log                     = /usr/local/coreseek/var/log/searchd_article.log

        query_log               = /usr/local/coreseek/var/log/query_article.log

}

~~~

 

创建索引和测试全文检索

测试indexer索引

/usr/local/coreseek/bin/indexer -c etc/csft.conf 

 

测试sphinx索引文件

/usr/local/coreseek/bin/indexer -c etc/csft.conf —all

 

使用search程序测试全文检索(注意是search不是search)

/usr/local/coreseek/bin/search -c etc/csft.conf -a asdf北京

 

停止sphinxsearchd服务, 开启coreseeksearchd服务

service searchd stop

 

关闭sphinx的自启动服务

chkconfig searchd off

 

开启coreseek的自启动服务

echo "/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf" >> /etc/rc.d/rc.local

 

使用PHP API调用coreseek

复制api/sphinxapi.php到项目中, 然后写测试程序, (需要先将sphinxphp扩展关闭, 修改php.ini, sphinx.so注释, 然后重启php-fpm)

 

 

现在实现了中文检索, 但是有新的数据还不能够检索到, 下面就开始增量索引实践, 参考地址: http://blog.csdn.net/kongdeqian1988/article/details/38303343

 

先建立一张增量索引记录表pre_coreseek(id,maxid)

CREATE TABLE `pre_coreseek` (

  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,

  `maxid` int(11) unsigned NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

修改配置

vim /usr/local/coreseek/etc/csft.conf

~~~

#

# Minimal Sphinx configuration sample (clean, simple, functional)

#

 

##索引源##

source article_src

{

        type                    = mysql ##数据源类型

 

        sql_host                = rdsnnamnbnnamnbprivate.mysql.rds.aliyuncs.com ##mysql主机

        sql_user                = maxwelldu ##mysql 用户名

        sql_pass                = yu13jiu14 ##mysql密码

        sql_db                  = blog  ##mysql数据库名

        sql_port                = 3306  ##mysql端口 

        sql_query_pre           = SET NAMES UTF8 ##mysql检索编码

        sql_query_pre           = REPLACE INTO pre_coreseek SELECT 1,MAX(id) from sphinx_article

 

        sql_query               = SELECT id, title, cat_id, member_id, content, created FROM sphinx_article WHERE id < (SELECT maxid FROM pre_coreseek WHERE id=1) ##获取数据的sql

 

        ##过滤或条件查询的属性##

        sql_attr_uint           = cat_id

        sql_attr_uint           = member_id

        sql_attr_timestamp      = created

 

        sql_query_info          = SELECT * FROM sphinx_article WHERE id=$id

        sql_query_info_pre      = SET NAMES utf8

}

 

source increment : article_src

{

        sql_query_pre           = SET NAMES utf8

        sql_query               = SELECT id, title, cat_id, member_id, content, created FROM sphinx_article WHERE id > (SELECT maxid FROM pre_coreseek WHERE id=1) ##获取数据的sql

}

 

##索引

index article

{

        source                  = article_src ##声明索引源

        path                    = /usr/local/coreseek/var/data/article ##索引文件存放路径及索引的文件名

        docinfo                 = extern ##文档信息存储方式

        mlock                   = 0 ##缓存数据内存锁定

        morphology              = none ##形态学(对中文无效)

        min_word_len            = 1 ##索引的词最小长度

        charset_type            = zh_cn.utf-8 ##数据编码

        charset_dictpath        = /usr/local/mmseg3/etc/

}

 

index increment : article

{

        source                  = increment

        path                    = /usr/local/coreseek/var/data/increment

}

 

indexer

{

        mem_limit               = 128M

}

indexer

{

        mem_limit               = 128M

}

 

 

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_article.pid

        log                     = /usr/local/coreseek/var/log/searchd_article.log

        query_log               = /usr/local/coreseek/var/log/query_article.log

}

~~~

 

停止searchd服务

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf --stop

 

第一次启动建立全索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf  --all

 

启动searchd 后台模式,启动前一定先建立好全索引,不然启动失败或增量索引部分会索引不到

 

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf   ###启动

 

添加一些数据 , 尝试检索, 发现索引不到

 

增量索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf increment --rotate

 

合并索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --merge article increment --merge-dst-range deleted 0 0 --rotate

 

到现在为止可以检索到了

 

可以写个定时cron每隔30分钟作一次增量索引

 

可以写个定时cron每隔1天作一次全索引以确定保持数据的一致性

 

做实验的时候每隔一分钟做一次增量索引

*/1 * * * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf increment --rotate

*/1 * * * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --merge article increment --merge-dst-range deleted 0 0 —rotate

 

每天做一次全索引, 确保数据的一致性

 

* * */1 * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf  --all

分享到:
评论

相关推荐

    语音识别 sphinx4 JAVA 教程

    这些文档和博客文章提供了详细的教程和实践案例,有助于深入理解和应用Sphinx-4。此外,CSDN社区等开发者论坛也是寻求帮助和交流经验的好去处。 总之,Sphinx-4为Java开发者提供了一种强大的语音识别解决方案,虽然...

    java 整合 sphinx

    7. **实践应用**: 在实际项目中,Java整合Sphinx可用于电商网站的商品搜索、论坛的帖子搜索、新闻网站的内容搜索等多种场景。通过Sphinx的全文检索和高级查询功能,可以提高用户的搜索体验,同时减少服务器负载。 ...

    pocketsphinx语音库

    **Pocketsphinx语音库详解** Pocketsphinx是CMU Sphinx项目的一部分,由卡内基梅隆大学(Carnegie ...通过以上内容,读者不仅可以了解Pocketsphinx的基本原理,还能掌握如何在实践中运用这个强大的语音识别工具。

    pocketsphinx-android-demo资源包

    《探索pocketsphinx-android-demo:语音识别在Android平台的应用》 在移动设备上,语音识别技术已经成为人机交互的重要...通过深入研究和实践,我们可以掌握Pocketsphinx的使用,并将其应用于各种创新的移动应用中。

    pocketsphinx、speechrecognition中文语音包.rar

    **正文** 本文将详细介绍pocketsphinx以及其在中文语音识别中的应用。...通过理解声学模型和语言模型的概念,以及如何在实践中使用它们,我们可以在各种应用场景中利用这些工具进行有效的语音交互设计。

    Sphinx 全文检索实践指南 - 介绍.pdf

    51CTO技术沙龙第19期讲义:Sphinx 全文检索实践指南主讲:李沫南部分主要内容:全文检索 VS 数据库检索SELECT * FROM documents WHERE title like '%test%'CPU 100%'30秒内只能进行一次查询'没有找到记录......

    sphinx+xdict+安装说明.zip

    Sphinx是一款开源的全文搜索引擎,它为开发者提供了一个高效、可扩展且易用的解决方案,用于构建自定义的全文检索功能。在中文环境下,Sphinx可能面临...在实践中,不断优化和调整配置参数,可以进一步提升用户体验。

    sphinx+mysql 安装手册

    **Sphinx+MySQL安装手册** ...通过学习和实践,你可以构建出一个稳定、高效的全文搜索引擎系统,满足大规模数据的检索需求。在实际操作过程中,应根据具体业务场景和硬件环境进行适当的调整和优化。

    sphinx4-5prealpha-src.zip

    Sphinx4是一个强大的开源语音识别框架,主要由Java语言编写,提供了一...总的来说,sphinx4-5prealpha-src.zip为开发者提供了一个探索语音识别技术的平台,通过深入理解和实践,可以构建出满足特定需求的语音识别应用。

    Linux下php+sphinx实例

    在Linux环境中,构建一个基于PHP和Sphinx的搜索系统是一个高效且强大的解决方案,尤其适用于大数据量的全文检索。...记住,实践是最好的老师,通过不断的调试和优化,你可以实现更复杂、更高效的搜索功能。

    pocketsphinx库学习用的一个简单的语言模型(lm、dic文件)

    《深入理解Pocketsphinx:基于lm与dic文件的语音识别》 Pocketsphinx是一个轻量级的开源语音识别引擎,广泛应用于嵌入式系统...在实践过程中,不断地优化和调整这些模型文件,是提升Pocketsphinx识别效果的关键步骤。

    php 搜索Sphinx

    《PHP搜索Sphinx:深入解析与实践》 一、引言 Sphinx是一个高性能的全文检索引擎,由Andrew Aksyonoff开发,并以其强大的搜索功能和广泛的适用性在IT行业中享有盛誉。本文将深入探讨Sphinx的工作原理,以及如何...

    sphinx的demo

    Sphinx 是一个开源全文搜索引擎,它为开发者提供了一个强大的、可扩展的、易于集成到应用程序中的搜索解决方案。Sphinx 的设计目标是...通过阅读给定的博客文章和实践操作,你可以逐步了解并精通 Sphinx 的各项功能。

    sphinx介绍

    Sphinx以其高效、灵活和可扩展性著称,广泛应用于网站、数据库和各类信息系统中。 1. **Sphinx安装**: 安装Sphinx通常涉及下载源代码,编译并安装。首先,你需要访问Sphinx的官方网站获取最新版本的源代码。然后...

    sphinx 测试可用 改下数据库

    在“sphinx 测试可用 改下数据库”这个标题中,我们可以推测这可能是一个关于如何测试并配置 Sphinx 以适应特定数据库的实践过程。 首先,我们要理解Sphinx的基本工作原理。Sphinx通过建立倒排索引来实现高效的全文...

    sphinx-4 java 资料

    Sphinx-4的设计不仅汲取了过往系统设计中的最佳实践模式,还考虑到了当前研究人员感兴趣的新兴领域的需求。 #### 设计理念与目标 Sphinx-4的设计理念是灵活性和模块化。这意味着它能够支持各种不同的语音识别方法...

    django-1.4.3文档(使用sphinx生成)

    总的来说,Django 1.4.3的文档和Sphinx的结合,不仅为开发者提供了一份详尽的学习资料,也展示了高效文档生成的最佳实践。无论你是正在学习Django的新手,还是已经在项目中积累了经验的老手,都应该充分利用这些资源...

    sphinx2.2.10-release.tar.gz

    7. **最佳实践**: - **保持文档结构清晰**:按照模块、类和函数组织文档结构。 - **编写清晰的文档字符串**:在代码中添加详细的文档字符串,方便 `autodoc` 扩展使用。 - **定期更新文档**:确保文档与代码同步...

    Asphyre Sphinx 最最最初级的教程

    理解和实践状态机模式对于游戏设计非常重要。 6. **多线程**:为了提高游戏性能,Asphyre Sphinx可能支持多线程编程,使某些计算任务能够在后台运行,不影响主游戏循环。 7. **网络编程**:如果游戏涉及到多人在线...

    Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率-IT计算机-毕业设计.zip

    本项目利用开源的PocketSphinx库实现了一个离线语音识别系统,其在小范围语音识别上达到了99%的高准确率,这对于毕业设计和学习Android开发的学生来说是一个很好的实践案例。 PocketSphinx是一个轻量级的语音识别...

Global site tag (gtag.js) - Google Analytics