Sphinx 文档,Sphinx

  Sphinx 文档,Sphinx 

  2.1安装在GNU/Linux/unix系统上

  2.1.1 sphinx安装2.1.2.sfc安装(见另文)2.1.3.coreseek安装(见另文)2.2安装在windows下。

  3.配置示例4。应用

  4.1使用API调用在CLI 4.2上进行测试

  5.附录

  1.1简介。狮身人面像

  1.1.斯芬克斯是什么?

  Sphinx是俄罗斯人Andrew Aksyonoff开发的全文搜索引擎。它旨在为其他应用程序提供高速、低空间占用、高相关性的全文搜索功能。Sphinx可以很容易地与SQL数据库和脚本语言集成。目前系统内置了对MySQL和PostgreSQL数据库数据源的支持,还支持从标准输入中读取特定格式的XML数据。通过修改源代码,用户可以自己添加新的数据源(例如,其他类型的DBMS的本机支持)

  1.2.斯芬克斯的特征

  高速索引(在当代CPU上,峰值性能可达10mb/s);高性能搜索(对于24gb的文本数据,每次搜索的平均响应时间不到0.1秒);可以处理海量数据(目前已知在单个CPU系统上可以处理超过100 GB的文本数据和100 M的文档);提供了一种优秀的相关算法——基于短语相似度和统计的复合排序方法(BM25)。支持分布式搜索;支持短语搜索,提供文档摘要生成,作为MySQL的存储引擎提供搜索服务;支持布尔、短语、词语相似度等检索模式;文档支持多个全文搜索字段(最多32个);文档支持多个附加属性信息(如分组信息、时间戳等。);支持分词;

  1.3.Sphinx中文分词

  中文全文检索不同于英文等拉丁系列,按空格等特殊字符断词,而中文按语义分词。目前大部分数据库都不支持中文全文检索,比如Mysql。所以国内有一些中文全文搜索的Mysql插件,最好的是hightman的中文分词。Sphinx如果需要中文全文检索,需要一些插件来补充。我知道的插件有coreseek和SFC。

  Coreseek是sphinx使用最广泛的中文全文搜索,它提供了一个为Sphinx设计的中文分词包LibMMSeg。它还提供了几个系统的二进制发行版,包括rpm、deb和windows下的二进制包。此外,coreseek还为sphinx贡献了以下内容:

  GBK编码的数据源支持使用志豪蔡氏MMSEG算法的中文分词机器中文用户手册(该中文手册为sphinx 3354的国内新手用户,尤其是英语不好的用户提供了极大的便利)。sfc(sphinx-for-chinese)是网友happy提供的另一款中文分词插件。它的汉语词典用的是xdict。据其介绍,经过测试,目前的版本基本可以达到UTF-8英语(Linux测试平台)的一半索引速度,也就是官方宣称速度的一半。(时间主要花在分词上)。现在提供了与最新版本的sphinx (sphinx 0.9.10)同步的sphinx-for-chinese-0.9.10-dev-r2006.tar.gz。这个版本增加了sql_attr_string,我自己测试过。安装配置非常方便。开心哥在分词方面还有一个贡献:3354 php-MMSEG,这是一个针对中文分词的php扩展库。

  在此,向上述两位作者致以崇高的敬意。

  另外,如果你对中文分词不感兴趣。或者只需要实现像sql这样的函数,比如:select * from product where prodname like“% mobile phone %”。斯芬克斯也不会让你失望。这可能是官网对中文的简单实现:3354直接词索引。而且搜索速度还不错_

  本文将对上述三个中文应用进行测试,并记录为文档,这可能是本文的重点。

  2.安装配置示例。

  2.1安装在GNU/Linux/unix系统上

  Sphinx可以通过两种方式应用于mysql:

   API调用,如使用PHP和java的API函数或方法查询等。优点是mysql无需重新编译,服务器进程“低耦合”,程序调用灵活方便;

  缺点是,如果有一个现有的搜索程序,有些程序需要修改。推荐给程序员。

  使用插件方法(sphinxSE)将sphinx编译成mysql插件,并使用特定的sql语句进行检索。它的特点是很容易在sql中组合,可以直接向客户端返回数据。

  不需要进行第二次查询(注意),只需要在程序中修改对应的sql即可,但这对于使用框架开发的程序来说是不方便的,比如ORM。另外,mysql需要重新编译,需要mysql-5.1或以上版本。

  支持插件存储。系统管理员可以使用这种方法。

  二次查询注意:到目前发布版本——sphinx-0.9.9,sphinx只能返回记录的ID,而不是要查询的sql数据,所以需要根据这些ID再次查询数据库。

  sphinx 0.9.10的开发版本已经可以存储这些文本数据。笔者之前试过,性能和存储效果都不好。毕竟正式版还没发布。

  本文采用第一种方法。

  要在*nix系统下安装,您首先需要以下软件支持。

  软件环境:

  操作系统:Centos-5.2数据库:mysql-5.0.77-3.el5 mysql-devel(如果要使用sphinxSE插件存储请使用mysql-5.1或以上版本)编译软件:gcc gcc-c autoconf automake Sphinx:Sphinx-0 . 9 . 9(最新稳定版)

  安装:

  [root @ localhost ~]# yum install-y MySQL MySQL-devel[root @ localhost ~]# yum install-y automake autoconf[root @ localhost ~]# CD/usr/local/src/[root @ localhost src]# wget http://www . sphinx search . com/downloads/sphinx-0 . 9 . 9 . tar . gz[root @ localhost src]# tar zxvf sphinx-0 . 9 . 9 . tar . gz[root @ localhost/configureprefix=/usr/local/sphinx #注意:这里,Sphinx已经默认支持MySQL[root @ localhost Sphinx-0 . 9 . 9]# make make install #,可以忽略“警告”。

  安装完成后,检查/usr/local/sphinx下是否有三个目录bin etc var。如果是,说明安装正确!

  2.1.2.sfc安装(点击进入)

  2.1.3.coreseek安装(点击进入)

  3.配置示例

  3.1.数据来源。

  这里我们使用mysql作为数据源。详情如下:

  Mysql服务器:192.168.1.10

  Mysql数据库:测试

  Mysql表:test.sphinx_article

  mysql desc斯芬克斯_ article

  ——— ——————— —— — ——— —————-

   Field Type Null Key Default Extra

  ——— ——————— —— — ——— —————-

   id int(11)unsigned NO PRI NULL auto _ increment

   title varchar(255) NO

   cat _ id tinyint(3)unsigned NO MUL

   member _ id int(11)unsigned NO MUL

   content longtext NO

   created int(11) NO MUL

  ——— ——————— —— — ——— —————-

  一组6行(0.00秒)

  3.2.配置文件

  [root @ localhost ~]# CD/usr/local/sphinx/etc #转到Sphinx的配置文件目录[root @ localhost etc]# cpsphinx . conf #创建新的Sphinx配置文件[root @ localhost etc]# vimsphinx . conf #编辑sphinx.conf。

  特定实例配置文件:

  # # # # #索引源# # # # # # #

  源文章_src

  {

  Type=mysql ##### #数据源类型

  SQL _ host=192 . 168 . 1 . 10 # # # # # MySQL主机

  SQL _ user=root # # # # # # MySQL用户名

  SQL _ pass=PWD # # # # # # # MySQL密码

  SQL _ DB=test # # # # # # MySQL数据库名称

  SQL _ port=3306 # # # # # # # MySQL端口

  SQL _ query _ pre=set names UTF8 # # # MySQL搜索代码。这一点要特别注意。很多人找不到中文的,但是数据库的代码是GBK或者其他非UTF8。

  Sql _ query=select ID,title,cat _ ID,member _ ID,content,从sphinx _ article # # # # # # SQL创建,用于获取数据

  # # # # #以下属性用于过滤或条件查询# # # # # # # #

  SQL _ attr _ uint=cat _ id # # # # # #无符号整数属性

  sql_attr_uint=成员id

  SQL _ attr _ timestamp=已创建# # # # # # Unix时间戳属性

  SQL _ query _ info=select * from sphinx _ article其中id=$ id # # # # # # #用于测试命令接口(CLI)调用

  }

  # # #索引# # #

  索引文章

  {

  Source=article_src #### #声明索引来源

  path=/usr/local/sphinx/var/data/article # # # # #索引文件的存储路径和索引的文件名。

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

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

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

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

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

  ##### 字符表,注意:如使用这种方式,则狮身人面像会对中文进行单字切分,

  ##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如证监会coreseek

  charset_table=U FF10.U FF19- 0.9, 0.9、U FF41.U FF5A- a.z,U FF21.U FF3A- a.z,\

  A.Z- a.z,a.z,U 0149,U 017F,U 0138,U 00DF,U 00FF,U 00C0.U 00D6- U 00E0.U 00F6,\

  U 00E0.U 00F6,U 00D8.U 00DE- U 00F8.U 00FE,U 00F8.U 00FE,U 0100- U 0101,U 0101,\

  U 0102- U 0103,U 0103,U 0104- U 0105,U 0105,U 0106- U 0107,U 0107,U 0108- U 0109,\

  U 0109,U 010A- U 010B,U 010B,U 010C- U 010D,U 010D,U 010E- U 010F,U 010F,\

  U 0110- U 0111,U 0111,U 0112- U 0113,U 0113,U 0114- U 0115,U 0115,\

  U 0116- U 0117,U 0117,U 0118- U 0119,U 0119,U 011A- U 011B,U 011B,U 011C- U 011D,\

  U 011D,U 011E- U 011F,U 011F,U 0130- U 0131,U 0131,U 0132- U 0133,U 0133,\

  U 0134- U 0135,U 0135,U 0136- U 0137,U 0137,U 0139- U 013A,U 013A,U 013B- U 013C,\

  U 013C,U 013D- U 013E,U 013E,U 013F- U 0140,U 0140,U 0141- U 0142,U 0142,\

  U 0143- U 0144,U 0144,U 0145- U 0146,U 0146,U 0147- U 0148,U 0148,U 014A- U 014B,\

  U 014B,U 014C- U 014D,U 014D,U 014E- U 014F,U 014F,U 0150- U 0151,U 0151,\

  U 0152- U 0153,U 0153,U 0154- U 0155,U 0155,U 0156- U 0157,U 0157,U 0158- U 0159,\

  U 0159,U 015A- U 015B,U 015B,U 015C- U 015D,U 015D,U 015E- U 015F,U 015F,\

  U 0160- U 0161,U 0161,U 0162- U 0163,U 0163,U 0164- U 0165,U 0165,U 0166- U 0167,\

  U 0167,U 0168- U 0169,U 0169,U 016A- U 016B,U 016B,U 016C- U 016D,U 016D,\

  U 016E- U 016F,U 016F,U 0170- U 0171,U 0171,U 0172- U 0173,U 0173,U 0174- U 0175,\

  U 0175,U 0176- U 0177,U 0177,U 0178- U 00FF,U 00FF,U 0179- U 017A,U 017A,\

  U 017B- U 017C,U 017C,U 017D- U 017E,U 017E,U 0410.U 042F- U 0430.U 044F,\

  U 0430.U 044F,U 05D0.U 05EA,U 0531.U 0556- U 0561.U 0586,U 0561.U 0587,\

  U 0621.U 063A、U 01B9、U 01BF、U 0640.U 064A、U 0660.U 0669,U 066E,U 066F,\

  U 0671.U 06D3,U 06F0.U 06FF,U 0904.U 0939,U 0958.U 095F,U 0960.U 0963,\

  U 0966.U 096F、U 097B.U 097F,U 0985.U 09B9,U 09CE,U 09DC.U 09E3,U 09E6.U 09EF,\

  U 0A05.U 0A39,U 0A59.U 0A5E,U 0A66.U 0A6F,U 0A85.U 0AB9,U 0AE0.U 0AE3,\

  U 0AE6.U 0AEF,U 0B05.U 0B39,U 0B5C.U 0B61,U 0B66.U 0B6F,U 0B71,U 0B85.U 0BB9,\

  U 0BE6.U 0BF2,U 0C05.U 0C39,U 0C66.U 0C6F,U 0C85.U 0CB9,U 0CDE.U 0CE3,\

  U 0CE6.U 0CEF,U 0D05.U 0D39,U 0D60,U 0D61,U 0D66.U 0D6F,U 0D85.U 0DC6,\

  U 1900.1938年,1946年.U 194F,U A800.U A805,U A807.U A822,U 0386- U 03B1,\

  U 03AC- U 03B1,U 0388- U 03B5,U 03AD- U 03B5,U 0389- U 03B7,U 03AE- U 03B7,\

  U 038A- U 03B9,U 0390- U 03B9,U 03AA- U 03B9,U 03AF- U 03B9,U 03CA- U 03B9,\

  U 038C- U 03BF,U 03CC- U 03BF,U 038E- U 03C5,U 03AB- U 03C5,U 03B0- U 03C5,\

  U 03CB- U 03C5,U 03CD- U 03C5,U 038F- U 03C9,U 03CE- U 03C9,U 03C2- U 03C3,\

  U 0391.U 03A1- U 03B1.U 03C1,U 03A3.U 03A9- U 03C3.U 03C9,U 03B1.U 03C1,\

  U 03C3.U 03C9,U 0E01.U 0E2E,U 0E30.U 0E3A,U 0E40.U 0E45,U 0E47,U 0E50.U 0E59,\

  U A000.U A48F,U 4E00.U 9FBF,U 3400.20000美元.U 2A6DF,U F900.U FAFF,\

  U 2F800.U 2FA1F,U 2E80.U 2EFF,U 2F00.U 2FDF,U 3100.U 312F,U 31A0.U 31BF,\

  U 3040.U 309F,U 30A0.U 30FF,U 31F0.U 31FF,U AC00.U D7AF,U 1100.U 11FF,\

  U 3130.U 318F,U A000.U A48F,U A490.U A4CF

  min_prefix_len=0 #最小前缀

  min_infix_len=1 #最小中缀

  ngram_len=1 #对于非字母型数据的长度切割

  #加上这个选项,则会对每个中文,英文字词进行分割,速度会慢

  #ngram_chars=U 4E00.U 9FBF,U 3400.20000美元.U 2A6DF,U F900.U FAFF,\

  #U 2F800.U 2FA1F,U 2E80.U 2EFF,U 2F00.U 2FDF,U 3100.U 312F,U 31A0.U 31BF,\

  #U 3040.U 309F,U 30A0.U 30FF,U 31F0.U 31FF,U AC00.U D7AF,U 1100.U 11FF,\

  #U 3130.U 318F,U A000.U A48F,U A490.U A4CF

  }

  ######### 索引器配置#####

  分度器

  {

  mem_limit=256M #####内存限制

  }

  ###########斯芬克斯服务进程########

  搜索d

  {

  #听=9312 ###监听端口,在此版本开始,官方已在互联网地址编码分配机构(互联网号码分配机构)获得正式授权的9312端口,以前版本默认的是3312

  log=/usr/local/sphinx/var/log/searchd。日志# # # #服务进程日志,一旦狮身人面像出现异常,基本上可以从这里查询有效信息,轮换(旋转)出的问题一般可在此寻到答案

  query _ log=/usr/local/sphinx/var/log/query。日志# # #客户端查询日志,笔者注:若欲对一些关键词进行统计,可以分析此日志文件

  read_timeout=5 #请求超时

  max_children=30 ###同时可执行的最大搜索d进程数

  PID _ file=/usr/local/sphinx/var/log/searchd。管道仪表流程图# # # # #进程身份文件

  max_matches=1000 ###查询结果的最大返回数

  无缝_旋转=1 ###是否支持无缝切换,做增量索引时通常需要

  }

  3.3、建立索引文件

  [root @ localhost sphinx]# bin/indexer-c etc/sphinx。主配置文件文章###建立索引文件的命令

  斯芬克斯0.9.9版(r2117)

  版权所有2001年至2009年,安德鲁阿克肖诺夫

  使用配置文件“etc/斯芬克斯。conf"…

  索引索引"文章"…

  收集了1000个文档0.2兆字节

  已排序0.4兆位,完成99.6%

  总共1000个文件,210559字节

  总计3.585秒,58723字节/秒,278.89文档/秒

  总共2次读取,0.031秒,1428.8 kb/调用平均值,15.6毫秒/调用平均值

  总共11次写入,0.032秒,671.6 kb/调用平均值,2.9毫秒/调用平均值

  [root@localhost sphinx]#

  出现以上代表已经索引成功,若不成功的话请根据提示的错误修改配置文件,或到这里提问,我看到后会尽快解决

  4.应用

  4.1 在硬币指示器(硬币水平指示器的缩写)命令行界面(批处理脚本的命令行界面)上测试

  在上一步中,我们建立了索引,现在我们对刚建立的索引进行测试。测试有两种方式:CLI端和应用程序接口调用

  在硬币指示器(硬币水平指示器的缩写)命令行界面(批处理脚本的命令行界面)端上命令测试是使用狮身人面像自带的搜索命令:搜索

  ###### 在文章索引上检索"北京"关键词########

  [root @ localhost sphinx]# bin/search-c etc/sphinx。主配置文件北京

  斯芬克斯0.9.9版(r2117)

  版权所有2001年至2009年,安德鲁阿克肖诺夫

  使用配置文件“etc/斯芬克斯。conf"…

  索引"文章":查询北京:在0.008秒内返回995个匹配项中的995个

  显示匹配项:

  1.文档=76,权重=2,类别标识=1,成员标识=2,创建时间=2010年一月23日星期六19:05:09

  id=76

  title=??

  cat_id=1

  member_id=2

  内容=????

  已创建=1264244709

  2.文档=85,权重=2,类别标识=1,成员标识=2,创建时间=2010年一月23日星期六19:05:09

  id=85

  title=??

  cat_id=1

  member_id=2

  内容=???????

  已创建=1264244709

  ….这里省略….

  20.文档=17,权重=1,类别标识=1,成员标识=2,创建时间=2010年一月23日星期六19:05:09

  id=17

  title=??

  cat_id=1

  member_id=2

  内容=???????

  已创建=1264244709

  单词:

  1.北京:995份文件,999次点击

  至此,可以看到,我们已经检索出所有有关"北京"的信息

  注意:这里我使用的是油灰的客户端,在客户端编码设置的是utf-8,这个是测试的前提条件

  4.2 API调用

  在本例中,我使用服务器端编程语言(专业超文本预处理器的缩写)的美国石油学会(美国石油协会)来测试,在测试前,先启动狮身人面像服务进程,并对摘录的防火墙做好9312端口的开放

  [root @ localhost sphinx]# bin/searchd-c etc/sphinx。会议# # #使狮身人面像在后台运行

  [1] 5759

  [root @ localhost Sphinx]# Sphinx 0。9 .9版(r2117)

  版权所有2001年至2009年,安德鲁阿克肖诺夫

  使用配置文件“etc/斯芬克斯。conf"…

  监听所有接口,端口=9312

  [1]Done bin/searchd-c etc/sphinx。主配置文件

  服务器端编程语言(专业超文本预处理器的缩写)测试代码:

  ?服务器端编程语言(专业超文本预处理器的缩写)

  header( Content-type:text/html;charset=utf-8 );

  ?form name=" form 1 " method=" get " action="

  标签

  输入/标签

  标签

  输入type=" Submit " name=" Submit " value=" sphinx搜索"

  /标签

  /表单

  ?服务器端编程语言(专业超文本预处理器的缩写)

  $ keyword=$ _ GET[ keyword ];

  if(trim($ keyword)=){

  死(请输入关键词);

  }

  否则{

  回声关键词是:.$关键字

  }

  需要“斯芬克斯API。PHP”;

  $ cl=new sphinx client();

  $cl- SetServer(192.168.1.150 ,9312);//注意这里的主机

  # $ cl-SetMatchMode(SPH _匹配_扩展);//使用多字段模式

  //dump($ cl);

  $ index="文章

  $res=$cl- Query($keyword,$ index);

  $ err=$ cl-GetLastError();

  转储(RES);

  函数转储($var)

  {

  回声前

  var _ dump($ var);

  回显/前置

  }

  ?

  检索"北京"转储后的结果是如下:

  数组(10) {

  [错误]=

  字符串(0)""

  [警告]=

  字符串(0)""

  [状态]=

  int(0)

  [fields]=

  数组(2) {

  [0]=

  字符串(5)"标题"

  [1]=

  字符串(7)"内容"

  [attrs]=

  数组(3) {

  [cat_id]=

  int(1)

  [member_id]=

  int(1)

  [已创建]=

  int(2)

  [匹配]=

  数组(20) {

  [76]=

  数组(2) {

  [重量]=

  字符串(1)"2"

  [attrs]=

  数组(3) {

  [cat_id]=

  字符串(1)"1"

  [member_id]=

  字符串(1)"2"

  [已创建]=

  字符串(10) 1264244709

  .这里省略.

  [17]=

  数组(2) {

  [重量]=

  字符串(1)"1"

  [attrs]=

  数组(3) {

  [cat_id]=

  字符串(1)"1"

  [member_id]=

  字符串(1)"2"

  [已创建]=

  字符串(10) 1264244709

  [总计]=

  字符串(3)"995"

  [total_found]=

  字符串(3)"995"

  [时间]=

  字符串(5) 0.008

  [单词]=

  数组(1) {

  [北京]=

  数组(2) {

  [docs]=

  字符串(3)"995"

  [hits]=

  字符串(3)"999"

  至此服务器端编程语言(专业超文本预处理器的缩写)已可调用出结果!

  这是本人对狮身人面像写的入门手册,也为自己存档使用。为写本文,特重新安装了一遍斯芬克斯,并新建关系型数据库表加入1000条记录,动手重复了一下所有

  过程。如有错误或疑问请到以下地址反馈,谢谢!

  欢迎到狮身人面像中文站(www.sphinxsearch.org)讨论狮身人面像的相关问题,交流你我的思想!

  欢迎查阅我所写的狮身人面像的其他相关文章:斯芬克斯中文分词,斯芬克斯高级应用,斯芬克斯常见问题解答,斯芬克斯服务架构

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: