sphinx总结

    技术2022-05-19  24

    关于Sphinx 一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。 当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。 搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索API非常简单,可以在若干个小时之内移植到新的语言上。 Sphinx特性: 高速的建立索引(在当代CPU上,峰值性能可达到10MB/秒); 高性能的搜索(在2–4GB的文本数据上,平均每次检索响应时间小于0.1秒); 可处理海量数据(目前已知可以处理超过100GB的文本数据,在单一CPU的系统上可处理100M文档); 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法; 支持分布式搜索; 提供文件的摘录生成; 可作为MySQL的存储引擎提供搜索服务; 支持布尔、短语、词语相似度等多种检索模式; 文档支持多个全文检索字段(最大不超过32个); 文档支持多个额外的属性信息(例如:分组信息,时间戳等); 停止词查询; 支持单一字节编码和UTF-8编码; 原生的MySQL支持(同时支持MyISAM和InnoDB); 原生的PostgreSQL支持. 中文手册下载: http://www.coreseek.com/uploads/pdf/sphinx_doc_zhcn_0.9.pdf Sphinx在windows上的安装 直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本,下载后解压在D:/sphinx目录下; 在D:/sphinx/下新建一个data目录用来存放索引文件,一个log目录方日志文件,复制D:/sphinx/sphinx.conf.in到D:/sphinx/bin/sphinx.conf(注意修改文件名); 修改D:/sphinx/bin/sphinx.conf,主要修改一下几点: type        = mysql # 数据源,我这里是mysql sql_host    = localhost # 数据库服务器 sql_user    = root # 数据库用户名 sql_pass    = '' # 数据库密码 sql_db      = test # 数据库 sql_port    = 3306 # 数据库端口    *(非searchd进程端口) sql_query_pre   = SET NAMES utf8 # 去掉此行前面的注释,如果你的数据库是uft8编码的 index test1 { # 放索引的目录  path   = D:/sphinx/data/ # 编码  charset_type  = utf-8  #  指定utf-8的编码表  charset_table  = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F  # 简单分词,只支持0和1,如果要搜索中文,请指定为1  ngram_len    = 1 # 需要分词的字符,如果要搜索中文,去掉前面的注释  ngram_chars   = U+3000..U+2FA1F } # index test1stemmed : test1 # {  # path   = @CONFDIR@/data/test1stemmed  # morphology  = stem_en # }   # 如果没有分布式索引,注释掉下面的内容 # index dist1 # {  # 'distributed' index type MUST be specified  # type    = distributed  # local index to be searched  # there can be many local indexes configured  # local    = test1  # local    = test1stemmed  # remote agent  # multiple remote agents may be specified  # syntax is 'hostname:port:index1,[index2[,...]]  # agent    = localhost:3313:remote1  # agent    = localhost:3314:remote2,remote3  # remote agent connection timeout, milliseconds  # optional, default is 1000 ms, ie. 1 sec  # agent_connect_timeout = 1000  # remote agent query timeout, milliseconds  # optional, default is 3000 ms, ie. 3 sec  # agent_query_timeout  = 3000 # } # 搜索服务需要修改的部分 searchd { Listen  = 3312  0.9.9版默认端口为: 9312(不喜欢的可以调)  # 日志  log     = D:/sphinx/log/searchd.log  # PID file, searchd process ID file name  pid_file   = D:/sphinx/log/searchd.pid  # windows下启动searchd服务一定要注释掉这个  # seamless_rotate  = 1 } 导入测试数据 命令行模式下: C:/Program Files/MySQL/MySQL Server 5.0/bin>mysql -uroot test<d:/sphinx/example.sql 或者phpmyadmin下执行example.sql文件内的sql语句. 建立索引 D:/sphinx/bin>indexer.exe – all 结果类似: Sphinx 0.9.9-release (r1533) Copyright (c) 2001-2008, Andrew Aksyonoff using config file ‘./sphinx.conf’… indexing index ‘test1′… collected 4 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 4 docs, 193 bytes total 0.101 sec, 1916.30 bytes/sec, 39.72 docs/sec 启动Sphinx searchd服务 D:/sphinx/bin>searchd.exe   (保证持续连接) 执行搜索 D:/sphinx/bin>search.exe  test 返回结果类似: Sphinx 0.9.9-release (r1533) Copyright (c) 2001-2008, Andrew Aksyonoff using config file ‘./sphinx.conf’… index ‘test1′: query ‘test ‘: returned 3 matches of 3 total in 0.000 sec displaying matches: 1. document=1, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008         id=1         group_id=1         group_id2=5         date_added=2008-11-26 14:58:59         title=test one         content=this is my test document number one. also checking search within  phrases. 2. document=2, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008         id=2         group_id=1         group_id2=6         date_added=2008-11-26 14:58:59         title=test two         content=this is my test document number two 3. document=4, weight=1, group_id=2, date_added=Wed Nov 26 14:58:59 2008         id=4         group_id=2         group_id2=8         date_added=2008-11-26 14:58:59         title=doc number four         content=this is to test groups words: 1. ‘test’: 3 documents, 5 hits 注: document : 表的索引编号 weight : 权重 group_id: 数据来源标识date_added: 索引生成时间。剩下的就是与查询内容相关的表字段值。 测试中文搜索 在对中文做分词的时候可以将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..U+1938, U+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..U+4DBF, U+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 则sphinx会对中文进行单字切分(一元次分),即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc 等都包含分词库。 由于命令行是GBK编码。所以要新建一个php文件执行中文查询。 <?php require ‘sphinxapi.php’; $Sphinx = new SphinxClient(); $Sphinx->SetServer(‘localhost’,3312); $result = $Sphinx->Query(‘中文’); var_dump($result); ?>     9.  增量索引的使用 (1).在Mysql中建立一个增量表,凡是更新操作(添加,修改,删除),都会将相关ID更新到到增量表;表结构很简单,只记录ID. (2).修改Sphinx的配置文件   sql_query = SELECT 0 AS in_update FROM documents       sql_attr_uint = in_update                    增加了一个字段in_update,用来标记主索引的这条记录,是否在增量表中. (3).产品的更新操作时,除了更新增量表,同时也利用Sphinx API的 UpdateAttributes方法,将主索引中的相关记录的in_update属性设置成”1″ $Sphinx->UpdateAttributes( $index, array( 'in_update' ), array( $id => '1' ) ); 更新完了属性后,发出增量索引更新通知,可以是写队列,写文件等方式. (4).在查询时,增加过滤器.       $Sphinx->SetFilter( 'in_update', array(0) );      这样,就不会使用到主索引中的处于增量索引中的doc,以免搜索到错误的编辑前的数据. (5).守护进程接到增量索引更新通知,重建增量索引. (6).每天某时段更新主索引,清空增量表,清空增量索引…     图片概述:

    删除索引: 可以在创建索引时,配置文件中设置以下属性: sql_attr_bool = is_deleted is_deleted 默认值为 0 ,当记录要删除时,调用接口中的 UpdateAttributes设置其属性值为 1,在搜索和合并索引时增加过滤器只让is_deleted为 0 的记录通过 select id, title, content,1 as is_deleted from table $ sphinx ->UpdateAttributes('is_deleted', array('is_deleted'),array($id => array(0))); $sphinx->SetFilter(); SetFilter 设置过滤器只允许“is_deleted”为 0 的那些条件通过,而去除所有标记为已删除(“is_deleted” 为非0)的记录


    最新回复(0)