Sphinx全文检索

合集下载

Sphinx全文检索引

Sphinx全文检索引

Apache是什么?Apache是一个开源的Web服务器
2页
MySQL是什么?MySQL是一个开源的数据库
3页
PHP是什么?PHP是一个开源的脚本语言
4页
全文检索大体分两个过程:
索引创建(Indexer)和 搜索索引(Search)。 索引创建:将现实世界中所有的结构化和非结构化 数据提取信息,创建索引的过程。 搜索索引:就是得到用户的查询请求,搜索创建的 索引,然后返回结果的过程。
中文分词系统:
中文分词与英文分词有很大的不同, 英文一个单词就是一个词,而汉语是以字为基本的 书写单位,词语之间没有明显的区分标记,需要人 为切分。
中文分词系统,是利用计算机对中文文本进行词语 自动识别的系统,词语自动识别的方法我们通常称 为分词算法。
分词算法的分类:
主要有3大类: 1、 基于字符串匹配的分词方法。 2、 基于理解的分词方法。 3、 基于统计的分词方法
students but found them drunk (Tokenizer)。
分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):
1. 将文档分成一个一个单独的单词。 2. 去除标点符号。 3. 去除停词(Stop word)。 所谓停词(Stop word)就是一种语言中最普通的一些单词: 英语中的停词(Stop word)如:“the”,“a”,“this”等。 中文中的停词 如:‘是’‘的’‘这个’等。 对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。 经过分词(Tokenizer)后得到的结果称为词元(Token)。 在我们的例子中,便得到以下词元(Token): Students、allowed、go、their、friends、allowed、drink、beer、My、friend、Jerry、 went、school、see、his、students、found、them、drunk、allowed。

Sphinx 全文搜索引擎

Sphinx 全文搜索引擎

Sphinx 全文搜索引擎1:索引与全文索引的概念数据库中,表中的行特别多,如何快速的查询某一行,或者某一个文章中的单词,索引--->查询速度快全文索引-->针对文章内容中的单词各做索引2:mysql支不支持全文索引?答:支持, 但是A:innoDB引擎在5.5,及之前的版本不支持(5.7实测可以在innodb上建fulltext),只能在myisam 引擎上用fulltextB: mysql的全文索引功能不够强大C: 无法对中文进行合理的全文索引----- mysql.无法进行中文分词.注意:全文索引的停止词停止词是指出现频率极高的单词, 不予索引.如果某单词出现频率50%以上,列为停止词或者是经过统计的常用词,也列为停止词---如is, are , she, he, this 等等就像中文中: “的”,”是”,”呵呵”总结: 我们要对中文做全文搜索引擎,需要解决2个问题1: 性能提高,用第3方的全文搜索引擎工具,如sphinx, solr等2: 中文分词! (如mmseg)编译安装sphinx+mmseg == coreseek官网: 0: 安装工具包yum install make gcc gcc-c++ libtool autoconf automake imake libxml2-devel expat-devel1: 下载解压源码,ls查看csft-4.1 mmseg-3.2.14 README.txt testpack其中--csft-4.1是修改适应了中文环境后的sphinxMmseg 是中文分词插件Testpack是测试用的软件包2: 先安装mmseg2.1: cd mmseg2.2: 执行bootstrap脚本2.3: ./configure --prefix=/usr/local/mmseg2.4: make && make install3: 再安装sphinx(coreseek)3.1: 到其目录下执行buildconf.sh3.2: ./configure --prefix=/usr/local/sphinx--with-mysql=/usr/local/mysql--with-mmseg--with-mmseg-includes=/usr/local/mmseg/include/mmseg/--with-mmseg-libs=/usr/local/mmseg/lib/3.3: make installSphinx的使用分三个部分:1: 数据源---要让sphinx知道,查哪些数据,即针对哪些数据做索引(可以定义多个源)2: 索引配置--针对哪个源做索引, 索引文件放在哪个目录?? 等等3: 搜索服务器----sphinx可以在某个端口(默认9312),以其自身的协议,与外部程序做交互.具体的步骤:1: 数据源典型配置source test {type = mysqlsql_host = localhostsql_user = rootsql_pass =sql_db = testsql_query_pre = set names utf8sql_query_pre = set session query_cache_type=offsql_query = select id,catid,pubtime,title,content from newssql_attr_uint = idsql_attr_uint = catidsql_attr_timestamp = pubtimesql_query_info = select * from news where id=$id}2: 索引典型配置index test {type = plainsource = testpath = /usr/local/sphinx/var/data/test #生成索引放在哪docinfo = externcharset_dictpath = /usr/local/mmseg/etc/charset_type = zh_cn.utf-8}2.1: 生成索引文件/path/sphinx/bin/indexer -c ./etc/sphinx.test.conf test (test是索引名)2.2: 查询测试A:在命令下,用path/bin/search -c ./path/conf 关键词B:开启搜索服务器,利用客户端连接搜索服务器来查询,见下3: 配置搜索服务器接口,启动搜索服务器searchd {listen = localhost:9312pid_file = /usr/local/sphinx/var/log/searchd.pidlog = /usr/local/sphinx/var/log/test.logquery_log =/usr/local/sphinx/var/log/test.query.logclient_timeout = 5max_children = 5max_matches = 1000seamless_rotate = 1}3.2 : 使用客户端连接搜索服务器1)系统testpack包里带的sphinxapi.php2)编译php的sphinx扩展1: 官方搜索下载sphinx扩展的压缩包并解压(假设解析在/usr/local/src/sphinx) 2: /path/php/bin/phpize 执行3: configure --with-php-config=/xxx/path/php/bin/php-config出错: e rror: Cannot find libsphinxclient headers错误原因: 没有预告编译libsphinxclient4: 解决3中的错误cd /usr/local/src/sphinx/api/libsphixclient/目录下# sh buildconf.sh# ./configure# make && make install5: 编译php的sphinx.so扩展# cd /path/to/sphinx1.3.0/#./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx# make && make install6: 编辑php.ini,把sphinx.so扩展引入并重启apache, 如果是php-fpm方式运行,则重启php-fpm进程查询分3部分1: 查询2: 过滤3: 排序1.1: 查询的模式查询的模式直接影响查询结果,SPH_MA TCH_ALL, 匹配所有查询词(默认模式);SPH_MA TCH_ANY, 匹配查询词中的任意一个;SPH_MA TCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;SPH_MA TCH_BOOLEAN, 将查询看作一个布尔表达式SPH_MA TCH_ALL->Query(‘西瓜南瓜’) // 文档中有西瓜并且有南瓜才被选中SPH_MA TCH_ANY //->Query(‘西瓜南瓜’) // 文档中有西瓜或有南瓜被选中S PH_MA TCH_PHRASE // 严格理解为两词连续如内容”西瓜南瓜东瓜”->Query(‘西瓜南瓜’), 可以命中->Query(‘西瓜东瓜’), 不能命中, 因为西瓜东瓜两词不连续如果你觉得切换模式麻烦,可用BOOLEAN模式SPH_MA TCH_BOOLAN / /这个模式,能达到上3个模式的效果,需要在查询词之间做表达式如words1 & words2 则等同SPH_MA TCH_ALLWords1 | words2 则,等同SPH_MA TCH_ANYWords1 << word2 则是word1,word2都要有,且words1出现在word2前面1.2: 按字段查询如:要求只查content字段中的”西瓜”关键词“西瓜”====>”@content 西瓜”注意: 按字段查询需要把查询模式设置成”SPH_MA TCH_EXTNEDED”2 按属性过滤SetIDRange($min,$max); // 按id的范围过滤SetFilter($attr,$values=array(),$exclue=false); //SetFilterRange ( $attribute, $min, $max, $exclude=false )SetFilterFloatRange (设置浮点数范围)SetLimits($offset,$limits) //设置偏移量及取出条目例:->SetIDRange(2,3);->SetLimits(2,2); 取第3-4条->SetFilter(‘catid’,array(3,4),false) ; 以catid in (3,4) 为条件进行过滤->SetFilter(‘catid’,array(3,4),true) ; 以catid not in (3,4) 为条件,进行过滤注意:如果setLimits中碰到”per-query max_matches=0 out of bounds (per-server max_matches=1000)”错误,可以通过给setLimits指定第3个参数为大于0的整数,来解决.3: 按属性或权重排序排序模式:SPH_SORT_RELEV ANCE 模式, 按相关度降序排列(最好的匹配排在最前面)SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。

phpwind前台全文搜索实现(sphinx)

phpwind前台全文搜索实现(sphinx)

以下文档为根据网上某位网友的经验进行改进,实现了前台全文搜索。

phpwind本地部署,可以使用WAMP工具,方便快捷。

一拷贝pwsc到d盘二修改pwsc/bin 目录下的sphinx.conf 中的配置文件主要数据库账号密码等(回复日志没有做索引配置没有考虑主题分表的情况)三进入库建立表---- 表的结构`search_counter`--CREATE TABLE IF NOT EXISTS `search_counter` (`counterid` int(11) NOT NULL DEFAULT '0',`max_doc_id` int(11) NOT NULL DEFAULT '0',`min_doc_id` int(10) NOT NULL DEFAULT '0',PRIMARY KEY (`counterid`)) ENGINE=MyISAM DEFAULT CHARSET=gbk;---- 导出表中的数据`search_counter`--四建立索引dos下操作切换目录到d:/pwsc/bin 目录下indexer.exe --all --config ./sphinx.conf五D:\pwsc\bin\searchd.exe --install --config d:\pwsc\bin\sphinx.conf 添加为系统服务不用每次都手打启动D:\pwsc\bin\searchd.exe --delete 删除系统服务六dos 运行schtasks /create /sc minute /mo 20 /tn "pwsc" /tr d:\pwsc\searchd.bat(创建计划任务)schtasks /delete /tn * /f (删除所有计划任务)七到windows系统服务中启动searchd服务然后到后台开启sphinx功能在全局->创始人那里,可以开启后台全文搜索。

sphinx 原理

sphinx 原理

sphinx 原理
Sphinx是一种文本检索引擎,它基于全文搜索技术,可以快速地搜索和检索大量的文档。

Sphinx的原理主要包括索引和查询两个方面。

首先是索引过程。

Sphinx通过解析文档集合,并根据预定的规则和标准,对文本进行切词、分析和归类。

在切词过程中,Sphinx会去除停用词(如冠词、介词等)和特殊字符,同时将词语转化为规范形式,以提高搜索的准确性。

然后,Sphinx 将处理后的词语组成倒排索引,建立词项与文档的映射关系。

倒排索引类似于一个词典,可以根据词项快速地找到包含该词项的文档。

其次是查询过程。

当用户发起搜索请求时,Sphinx先对查询进行与索引相同的切词、分析和归类操作。

然后,Sphinx根据用户的查询条件,在倒排索引中查找与之相关的文档。

这个查找过程实际上是一个检索和排名的过程,Sphinx通过使用BM25算法或其他相似的算法,根据文档与查询的相关性分数进行排序,并返回排名最高的文档作为搜索结果。

总的来说,Sphinx的原理是通过建立倒排索引,将文档集合切分、分析和归类,然后根据用户的查询条件,在倒排索引中快速定位与之相关的文档,并根据相关性分数进行排序,最终返回搜索结果。

这种全文搜索技术可以应用于各种大规模文本数据的搜索和检索场景。

sphinx全文检索

sphinx全文检索

Table of Contents∙ 1. 简介o 1.1. 什么是Sphinx/Coreseeko 1.2. Sphinx/Coreseek 的特性o 1.3. 如何得到Sphinx/Coreseeko 1.4. 许可协议o 1.5. 作者和贡献者o 1.6. 历史∙ 2. 安装o 2.1. 支持的操作系统o 2.2. 需要的工具o 2.3. 在Linux、BSD上安装Sphinx/Coreseeko 2.4. 在Windows上安装Sphinx/Coreseeko 2.5. 已知的安装问题和解决办法o 2.6. Sphinx/Coreseek快速入门教程∙ 3. 建立索引o 3.1. 数据源o 3.2. 属性o 3.3. MVA (多值属性)o 3.4. 索引o 3.5. 源数据的限制o 3.6. 字符集、大小写转换和转换表o 3.7. SQL 数据源 (MySQL, PostgreSQL)o 3.8. xmlpipe 数据源o 3.9. xmlpipe2数据源o 3.10. Python 数据源o 3.11. 实时索引更新o 3.12. 索引合并∙ 4. 搜索o 4.1. 匹配模式o 4.2. 布尔查询语法o 4.3. 扩展查询语法o 4.4. 权值计算o 4.5. 排序模式o 4.6. 结果分组(聚类)o 4.7. 分布式搜索o 4.8. searchd查询日志格式o 4.9. MySQL 协议支持与 SphinxQL ∙ 5. 命令行工具参考o 5.1. indexer命令参考o 5.2. searchd命令参考o 5.3. search命令参考o 5.4. spelldump命令参考o 5.5. indextool命令参考6. API参考o 6.1. 通用API方法▪ 6.1.1. GetLastError (错误信息)▪ 6.1.2. GetLastWarning (告警信息)▪ 6.1.3. SetServer (设置搜索服务)▪ 6.1.4. SetRetries (设置失败重试)▪ 6.1.5. SetConnectTimeout (设置超时时间)▪ 6.1.6. SetArrayResult (设置结果返回格式)▪ 6.1.7. IsConnectError (检查链接错误)o 6.2. 通用搜索设置▪ 6.2.1. SetLimits (设置结果集偏移量)▪ 6.2.2. SetMaxQueryTime (设置最大搜索时间)▪ 6.2.3. SetOverride (设置临时属性值覆盖)▪ 6.2.4. SetSelect (设置返回信息的内容)o 6.3. 全文搜索设置▪ 6.3.1. SetMatchMode (设置匹配模式)▪ 6.3.2. SetRankingMode(设置评分模式)▪ 6.3.3. SetSortMode (设置排序模式)▪ 6.3.4. SetWeights (设置权重)▪ 6.3.5. SetFieldWeights (设置字段权重)▪ 6.3.6. SetIndexWeights (设置索引权重)o 6.4. 结果集过滤设置▪ 6.4.1. SetIDRange (设置查询ID范围)▪ 6.4.2. SetFilter (设置属性过滤)▪ 6.4.3. SetFilterRange (设置属性范围)▪ 6.4.4. SetFilterFloatRange (设置浮点数范围)▪ 6.4.5. SetGeoAnchor (设置地表距离锚点)o 6.5. 分组设置▪ 6.5.1. SetGroupBy (设置分组的属性)▪ 6.5.2. SetGroupDistinct (设置分组计算不同值的属性)o 6.6. 搜索数据▪ 6.6.1. Query (查询)▪ 6.6.2. AddQuery (增加批量查询)▪ 6.6.3. RunQueries (执行批量查询)▪ 6.6.4. ResetFilters (清除当前设置的过滤器)▪ 6.6.5. ResetGroupBy (清除现有的分组设置)o 6.7. 附加方法▪ 6.7.1. BuildExcerpts (产生文本摘要和高亮)▪ 6.7.2. UpdateAttributes (更新属性)▪ 6.7.3. BuildKeywords (获取分词结果)▪ 6.7.4. EscapeString (转义特殊字符)▪ 6.7.5. Status (查询服务状态)o 6.8. 持久连接▪ 6.8.1. Open (打开连接)▪ 6.8.2. Close (关闭连接)∙7. MySQL 存储引擎 (SphinxSE)o7.1. SphinxSE 概览o7.2. 安装 SphinxSE▪7.2.1. 为 MySQL 5.0.x 编译 SphinxSE▪7.2.2. 为 MySQL 5.1.x 编译 SphinxSE▪7.2.3. 检查 SphinxSE 安装o7.3. 使用 SphinxSEo7.4. 通过 MySQL 生成片段 (摘要)∙8. 报告BUG∙9. sphinx.conf选项参考o9.1. 数据源配置选项▪9.1.1. type▪9.1.2. sql_host▪9.1.3. sql_port▪9.1.4. sql_user▪9.1.5. sql_pass▪9.1.6. sql_db▪9.1.7. sql_sock▪9.1.8. mysql_connect_flags▪9.1.9. mysql_ssl_cert, mysql_ssl_key, mysql_ssl_ca▪9.1.10. odbc_dsn▪9.1.11. sql_query_pre▪9.1.12. sql_query▪9.1.13. sql_query_range▪9.1.14. sql_range_step▪9.1.15. sql_query_killlist▪9.1.16. sql_attr_uint▪9.1.17. sql_attr_bool▪9.1.18. sql_attr_bigint▪9.1.19. sql_attr_timestamp▪9.1.20. sql_attr_str2ordinal▪9.1.21. sql_attr_float▪9.1.22. sql_attr_multi▪9.1.23. sql_query_post▪9.1.24. sql_query_post_index▪9.1.25. sql_ranged_throttle▪9.1.26. sql_query_info▪9.1.27. xmlpipe_command▪9.1.28. xmlpipe_field▪9.1.29. xmlpipe_attr_uint▪9.1.30. xmlpipe_attr_bool▪9.1.31. xmlpipe_attr_timestamp▪9.1.32. xmlpipe_attr_str2ordinal▪9.1.33. xmlpipe_attr_float▪9.1.34. xmlpipe_attr_multi▪9.1.35. xmlpipe_fixup_utf8▪9.1.36. mssql_winauth▪9.1.37. mssql_unicode▪9.1.38. unpack_zlib▪9.1.39. unpack_mysqlcompress▪9.1.40. unpack_mysqlcompress_maxsize o9.2. 索引配置选项▪9.2.1. type▪9.2.2. source▪9.2.3. path▪9.2.4. docinfo▪9.2.5. mlock▪9.2.6. morphology▪9.2.7. min_stemming_len▪9.2.8. stopwords▪9.2.9. wordforms▪9.2.10. exceptions▪9.2.11. min_word_len▪9.2.12. charset_type▪9.2.13. charset_table▪9.2.14. ignore_chars▪9.2.15. min_prefix_len▪9.2.16. min_infix_len▪9.2.17. prefix_fields▪9.2.18. infix_fields▪9.2.19. enable_star▪9.2.20. ngram_len▪9.2.21. ngram_chars▪9.2.22. phrase_boundary▪9.2.23. phrase_boundary_step▪9.2.24. html_strip▪9.2.25. html_index_attrs▪9.2.26. html_remove_elements▪9.2.27. local▪9.2.28. agent▪9.2.29. agent_blackhole▪9.2.30. agent_connect_timeout▪9.2.31. agent_query_timeout▪9.2.32. preopen▪9.2.33. ondisk_dict▪9.2.34. inplace_enable▪9.2.36. inplace_docinfo_gap▪9.2.37. inplace_reloc_factor▪9.2.38. inplace_write_factor▪9.2.39. index_exact_words▪9.2.40. overshort_step▪9.2.41. stopword_stepo9.3. indexer程序配置选项▪9.3.1. mem_limit▪9.3.2. max_iops▪9.3.3. max_iosize▪9.3.4. max_xmlpipe2_field▪9.3.5. write_buffero9.4. searchd程序配置选项▪9.4.1. listen▪9.4.2. address▪9.4.3. port▪9.4.4. log▪9.4.5. query_log▪9.4.6. read_timeout▪9.4.7. client_timeout▪9.4.8. max_children▪9.4.9. pid_file▪9.4.10. max_matches▪9.4.11. seamless_rotate▪9.4.12. preopen_indexes▪9.4.13. unlink_old▪9.4.14. attr_flush_period▪9.4.15. ondisk_dict_default▪9.4.16. max_packet_size▪9.4.17. mva_updates_pool▪9.4.18. crash_log_path▪9.4.19. max_filters▪9.4.20. max_filter_values▪9.4.21. listen_backlog▪9.4.22. read_buffer▪9.4.23. read_unhinted10. Coreseek特殊选项参考o10.1. 中文分词核心配置▪10.1.1. charset_dictpath▪10.1.2. charset_typeo10.2. MMSEG分词配置选项▪10.2.1. merge_number_and_ascii▪10.2.2. number_and_ascii_joint▪10.2.4. seperate_number_asciio10.3. Python数据源程序接口▪10.3.1. GetScheme() (设置检索字段的属性)▪10.3.2. GetKillList() (设置不参与检索的文档编号)▪10.3.3. GetFieldOrder() (设置字段的顺序)▪10.3.4. Connected() (获取数据前的连接处理)▪10.3.5. OnBeforeIndex() (数据获取前处理)▪10.3.6. NextDocument() (文档获取处理)▪10.3.7. OnAfterIndex() (数据获取后处理)▪10.3.8. OnIndexFinished() (索引完成时处理)A. Sphinx revision history。

项目实战sphinx应用精品PPT课件

项目实战sphinx应用精品PPT课件
不同的应用提供全文检索服务。
实战项目-sphinx.conf(二)
• indexer{ •… •} • searchd{ •… •}
实战项目-sphinx安装(一)
• Coreseek 安装
• 1)依赖包安装顺序 • m4、autoconf、automake、libtool yum或通:
• 基于字符串匹配的分词 • 基于理解的分词 • 基于统计的分词
实战项目-搜索引擎比较 (一)
• lucene功能强大,和消息队列结合会很好,唯一的缺点就是索引难维 护,特别是多个索引的情况下。sphinx不需要太注重索引维护,但是 支持的功能没有LUCENE强大,但是足够一个中小型网站使用。
• 功能说明:
• 全文检索系统需要具有建立索引,处理查询返回结果集,增加索引, 优化索引结构等功能。结构上,全文检索系统具有索引引擎,查询引 擎,文本分析引擎和对外接口等。
实战项目-中文分词
• 什么是中文分词:
• 英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单 位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空 格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合 起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文 分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一 个 学生。
• 2)进入到Coreseek目录下 分别安装 coreseek mmseg
• LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中 文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词 词库。

全文检索之Sphinx速成指南

全文检索之Sphinx速成指南

全文检索之Sphinx速成指南全文检索之Sphinx速成指南2008-07-02 12:24:51Database phpSphinx速成指南全文检索自动重建索引配置SphinxLeave a comment1. Sphinx简介1.1. 什么是全文检索全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。

检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。

1.2. 介绍Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。

1.3. Sphinx的特性高速索引(在新款CPU上,近10 MB/秒);高速搜索(2-4G的文本量中平均查询速度不到0.1秒);高可用性(单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名支持分布式搜索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索supports boolean, phrase, and word proximity queries;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码;supports English stemming, Russian stemming, and Soundex for morphology;支持MySQ(MyISAM和InnoDB 表都支持);支持PostgreSQL.2. Sphinx安装(For MySQL)2.1. Windows下安装从上下载MySQL5.0.45版安装配置好MySQL,采用utf-8字符集从Sphinx官网上/downloads.html 下载mysql-5.0.45-sphinxse-r871-win32.zip和sphinx-0.9.8-svn-r985-win32.zip如果您的MySQL服务已启动请先停止掉解压mysql-5.0.45-sphinxse-r871-win32.zip,将里面bin与share目录覆盖掉你的mysql安装目录下的相应目录解压sphinx-0.9.8-svn-r985-win32.zip ,将里面的文件解压到D:\sphinxsphinx的配置与实际应用是相关的,因此以下我以例子进行说明,至此sphinx安装部分结束2.2. Linux下安装下载mysql-5.1.22-rc.tar.gz解压至/root/mysql-5.1.22下载sphinx-0.9.8-svn-r985.tar.gz,解压至/root/sphinx-0.9.8-svn-r985将/root/sphinx-0.9.8-svn-r985/mysqlse下的文件复制至/root/mysql-5.1.22/storage/sphinx在/root/mysql-5.1.22目录下运行sh BUILD/autorun.sh./configure --prefix=/usr/local/mysql --with-charset=utf8--with-extra-charsets=all --enable-thread-safe-client--enable-assembler --with-readline --with-big-tables--with-plugins=sphinxmake && make installgroupadd mysqluseradd –g mysql mysqlchown mysql:mysql /usr/local/mysql -Rcd /usr/local/mysqlbin/mysql_install_db –user=mysql(此时系统可能会提示:[Warning] Storage engine 'SPHINX' has conflicting typecode. Assigning value 42.可忽略,不影响使用)cp /root/mysql-5.1.22/support-files/mysql.server/etc/init.d/mysqldchmod 700 /etc/init.d/mysqldcp /root/mysql-5.1.22/support-files/f /etc/f /etc/init.d/mysql start(至些mysql启动了)然后进入mysql命令行,运行show engines,看是不是有一个叫sphinx的engine,有的话就表示sphinxSE(mysql的sphinx引擎)安装正常了进入/root/sphinx-0.9.8-svn-r985,运行ldconfig /usr/local/mysql/lib/mysqlldconfig /usr/local/mysql/include/mysql./configure --prefix=/usr/local/sphinx--with-mysql=/usr/local/mysqlmake && make install3. 实例说明为更好说明如何应用Sphinx,现结合实例说明,我们以网站的新闻文章表为例。

Sphinx+Python+Oracle构建全文检索系统

Sphinx+Python+Oracle构建全文检索系统

Sphinx+Python+Oracle构建全文检索系统Sphinx+Python+Oracle构建全文检索系统摘要目前,很多大型企业的CRM系统在构建时都是采用Oracle 作为数据库,本文正是为这类系统提供一个可以作为参考实现的基于Sphinx的站内全文检索系统的实现方法。

关键词全文检索;Sphinx;站内检索1 Sphinx简介Sphinx是一个在GPLv2下分发的全文检索软件包,是SQL Phrase Index的缩写。

它最初开发的目的是为了在数据库驱动的网站中寻找解决索引质量、搜索性能等各方面的问题而开发的一个高性能独立的全文搜索软件包,所以它可以非常容易的与SQL数据库集成,为数据库驱动的网站提供高质量、高性能的站内搜索。

当前,Sphinx系统内置了MySQL和PostgreSQL数据库数据源的支持,也支持从管道标准输入读取特定格式的XML数据。

但是,目前Sphinx还不支持直接将Oeacle数据库作为数据源,但在最新的版本中,添加了Python数据源支持,这极大的扩展了数据源的来源,我们可以操作Python脚本作为数据源来获取Oracle中的数据。

2 Python数据源操作Oracle数据库的设计与实现考虑到安全、性能等因素,目前,很多大型的网站,尤其是大型企业的CRM 系统,在数据库构建方面都采用了Oracle数据库。

基于此,我的研究正是基于Oracle构建的大型企业CRM系统,借助Sphinx软件包提供全文搜索功能,同时结合MMSeg中文分词软件包来为网站生成一个功能强大的站内搜索引擎。

2.1系统目标本系统要实现一个基于Oracle数据库构建的企业CRM系统的高效的全文检索系统,并保证查询性能和查询结果的准确性,具体应满足以下两方面要求:1)在数据量较大时具有较高的查询性能,在海量数据检索时仍能保持较快的响应速度和准确率;2)以CRM系统在Oracle数据库中所存储的数据为检索目标,系统提供易于操作和使用的查询接口,用户可以通过该系统检索CRM系统上所有的网页内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. 语法分析主要是根据查询语句的语法规则来形
成一棵语法树。 AND NOT
Sphinx
PHP
Linux
3. 语言处理 同索引过程中的语言处理几乎相同。 如:Sphinx 变成 Sphin 除去停词等,我们得到 经过语言处理的语法树。
第三步:搜索索引,得到符合语法树的文档。
此步骤有分几小步: 首先,在索引表中,分别找出包含Sphinx,PHP,Linux的文 档链表。 其次,对包含Sphinx,PHP的链表进行合并操作,得到既包 含Sphinx又包含PHP的文档链表。 然后,将此链表与Linux的文档链表进行差操作,去除包含 Linux的文档,从而得到既包含Sphinx又包含PHP而且不包含 Linux的文档链表。
sphinx全文检索
什么是全文检索
一、生活中的数据总体分为:
结构化数据:指具有固定格式或有限长度的数据,如数据
库,元数据等。 非结构化数据:指没有固定格式或不定长的数据,如邮件 ,word文档等。 半结构化数据:如XML,HTML等,根据需要可按结构化数 据处理,也可以抽取纯文本按非结构化数据处理。
非结构化数据还有一种叫法:
全文数据。
二、按数据的分类,搜索也分为两种:
对结构化数据的搜索:
如对数据库的搜索:SQL语句。 再如windows的搜索:文件名,类型,修改时间。
对非结构化数据的搜索: 如windows对文件内容的搜索。 Linu查询语句进行词法分析, 语法分析,及语言处理。
1. 词法分析主要用来识别单词和关键字。 如上述例子中,经过词法分析,得到单词有Sphinx,PHP, Linux, 关键字有 AND,NOT。
如果在词法分析中发现不合法的关键字,则会出现错误。如 Sphinx AMD Linux,其中由于AND拼错,导致AMD作为一个普 通的单词参与查询。
模拟词典
Linux是什么,Linux是一个开源的操作系统。。
1页
Apache是什么?Apache是一个开源的Web服务器。
2页
MySQL是什么?MySQL是一个开源的数据库。。 3页
PHP是什么?PHP是一个开源的脚本语言。。 4页
全文检索大体分两个过程:
索引创建(Indexing)和 搜索索引(Search)。
那么又怎么对文档之间的关系进行打分呢?
我们先看看生活中的实例:
公司与公司之间的关系: 首先看一个公司是由什么人组成,如总经理,经理,首席技 术官,普通员工,保安,门卫等。 其次公司与公司之间的关系,不同的人重要性不同: 总经理,经理,首席技术官可能更重要一些,普通员工,保 安,门卫可能不重要。所以如果两个公司总经理,经理,首 席技术官之间关系比较好,两个公司容易有比较好的关系。 然而一位普通员工就算与另一家公司的一位普通员工有血海 深仇,怕也难影响两个公司之间的关系。
1、找出词(Term)对文档的重要性的过程称为 计算词的权重(Term weight)的过程。
计算词的权重(term weight)有两个参数, 第一个是词(Term),第二个是文档(Document)。 词的权重(Term weight)表示此词(Term)在此文档中的重要程度,越重 要的词(Term)有越大的权重(Term weight),因而在计算文档之间的相 关性中将发挥更大的作用。 影响一个词(Term)在一篇文档中的重要性主要有两个因: Term Frequency (tf): 即此Term在此文档中出现了多少次。tf 越大说明越重要。 Document Frequency (df): 即有多少文档包含次Term。df 越大说明越不重要。
索引所保存的信息一般如下: 假设我现在有100篇文档,从1到100表示。
Sphinx PHP Linux 2 2 32 5 34 44 17 5 65 66 87 78 23
词典
倒排表
二、如何创建索引?
全文检索的索引创建过程一般有以下几步: ① 一些需要创建索引的文档(Documents)。 ② 将原文档传给分词组件(Tokenizer) 。 ③ 将得到的词元(Token)传给语言处理组件 (Linguistic Processor)。 ④ 将得到的词(Term)传给索引组件(Indexer)。
为什么顺序扫描的速度慢?
非结构化数据中所存储的信息是每个文件包含哪些字符 串,已知文件,欲求字符串,从文件到字符串的映射。 而我们想搜索的信息是哪些字符串都在哪个文件中有, 已知字符串,欲求文件,从字符串到文件的映射。
如果有个东西总能够保存从字符串到文件的映射? 大大提高搜索速度。
总能保存这种关系的东西就是索引。
此文档链表就是我们要找的文档。
第四步:根据得到的文档和查询语句的相关性,对结果 进行排序
首先我们得到了想要的文档,然后我们需要对查询结果按照查 询语句的相关度进行排序,越相关的越靠前。 如何计算文档和查询语句的相关性呢?
我们把查询语句看作一片短小的文档,对文档与文档之间的相 关性(relevance)进行打分(scoring),分数高的相关性好, 就应该排在前面。
如何判断文档之间的关系: 首先,一个文档有很多词(Term)组成,如search, Sphinx, fulltext, this, a, what等。 其次对于文档之间的关系,不同的Term重要性不同,比如对 于本篇文档,search, Sphinx, fulltext就相对重要一些, this, a , what可能相对不重要一些。所以如果两篇文档都 包含search, Sphinx,fulltext,这两篇文档的相关性好一 些,然而就算一篇文档包含this, a, what,另一篇文档不 包含this, a, what,也不能影响两篇文档的相关性。 因而判断文档之间的关系: 1、找出哪些词(Term)对文档之间的关系最重要, 2、判断这些词(Term)之间的关系。
第三步:将得到的词元(Token) 传给语言处理组件 (Linguistic Processor)。 语言处理组件主要是对得到的词元做一些同语言相关的处理: 对于英语,语言处理组件一般做以下几点: 1. 变为小写(Lowercase)。 2. 将单词缩减为词根形式,如“cars”到“car”等。 3. 将单词转变为词根形式,如“drove”到“drive”等。
索引创建:将现实世界中所有的结构化和非结构
化数据提取信息,创建索引的过程。
搜索索引:就是得到用户的查询请求,搜索创建
的索引,然后返回结果的过程。
三个重要问题
① 索引里面究竟存些什么?(Index)
② 如何创建索引?(Indexing)
③ 如何对索引进行搜索?(Search)
一、索引里面究竟存些什么?
第二步:将原文档传给分词组件(Tokenizer)。
分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):
1. 将文档分成一个一个单独的单词。 2. 去除标点符号。 3. 去除停词(Stop word)。 所谓停词(Stop word)就是一种语言中最普通的一些单词: 英语中的停词(Stop word)如:“the”,“a”,“this”等。 中文中的停词 如:‘是’‘的’‘这个’等。 对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。 经过分词(Tokenizer)后得到的结果称为词元(Token)。 在我们的例子中,便得到以下词元(Token): Students、allowed、go、their、friends、allowed、drink、beer、My、 friend、Jerry、went、school、see、his、students、found、them、drunk、 allowed。有多少 文件包含此词(Term)
Frequency 即词频率 表示此文件中 包含了几个此词(Term)
到这里我们找到“想要得到的文档”
三、如何对索引进行搜索
搜索主要分为以下几步:
第一步:用户输入查询语句。 第二步:对查询语句进行词法分析,语法分析,及语言处理 第三步:搜索索引,得到符合语法树的文档。 第四步:根据得到的文档和查询语句的相关性,对结果进行 排序。
第一步:一些创建索引的文档。 文档1:Students should be allowed to go out
with their friends, but not allowed to drink beer.
文档2:My friend Jerry went to school to see
his students but found them drunk which is not allowed.
第一步、用户输入查询语句
查询语句同我们普通的语言一样,也是有一定语法的。 不同的查询语句有不同的语法,如SQL语句就有一定的语法, 查询语句的语法根据全文检索系统的实现而不同。 最基本的有比如:AND, OR, NOT等。 例子,用户输入语句:Sphinx AND PHP NOT Linux。 说明用户想找一个包含Sphinx和PHP然而不包括Linux的文档
对创建索引和搜索做一个总结:
1. 索引过程: 1) 有一系列被索引文件 2) 被索引文件经过语法分析和语言处理 形成一系列词(Term)。 3) 经过索引创建形成词典和反向索引表。 4) 通过索引存储将索引写入硬盘。 2. 搜索过程: a) 用户输入查询语句。 b) 对查询语句经过语法分析和语言分析 得到一系列词(Term)。 c) 通过语法分析得到一个查询树。 d) 通过索引存储将索引读入到内存。 e) 利用查询树搜索索引,从而得到每个 词(Term)的文档链表,对文档链表进行 交,差,并得到结果文档。 f) 将搜索到的结果文档对查询的相关性 进行排序。 g) 返回查询结果给用户。
2、判断词(Term)之间的关系从而得到文档相关性的过程, 应用一种叫做向量空间模型的算法(Vector Space Model)。 判断Term之间的关系从而得到文档相关性的过程, 也即向量空间模型的算法(VSM)。 我们把文档看作一系列词(Term),每一个词(Term)都有一个 权重(Term weight),不同的词(Term)根据自己在文档中的权 重来影响文档相关性的打分计算。 于是我们把所有此文档中词(term)的权重(term weight) 看 作一个向量。
相关文档
最新文档