为什么需要进行全文搜索呢?

一个表中有a、b、c多个字段。我们使用sql进行like搜索的时候,往往只能匹配某个字段。或者是这样的形式:a LIKE “%关键词%”or b LIKE “关键词”

这样子根本没法实现全文搜索,如果需要搜索整个表中所有出现过关键词”手机”的商品,一般要匹配商品的标题字段。而如果商品描述中出现”手机”关键词,则没法去匹配。

全文搜索,就是不限制搜索某个字段,是对数据库中所有的内容做匹配,是全文级别的搜索。是针对所有内容都进行匹配。这需要预先建立好索引数据结构。比如记录哪个文档中出现过某个关键词。

其实在11年的时候就已经研究过sphinx,理解还比较粗浅。

那个时候没有在生产环境中使用过。当时研究的是,安装sphinxSE存储引擎来实现。在本地电脑上搭建。sphinx作为mysql的一个存储引擎,结合到了mysql数据库中去。这样子查询sql不用做很多变动。

到2013年,才放到公司生产环境中使用。于是,自己完整搭建了一个sphinx环境。

sphinx充当什么角色?

帮助建立全文索引结构。查询的时候直接从这个索引结构中查询,可以快速实现查询。

sphinx是建立如下的倒排索引结构(学过倒排索引,估计大体是这样子):

关键词  此关键词出现文档编号(也就是mysql表中的主键值)

中国    8,9,10....

我      20,10...

..      ....

这样当你输入关键词"中国"进行查询的时候。马上就能从右边的文档列表中知道,哪些文档包含这个词语。

我对分词的理解是:所有涉及到全文索引的、分词。最终目标都是为了建立上面这样的倒排索引结构,那为什么要建立这样的结构,就是为了搜索某个词

语的时候,快速查询。

sphinx的实现原理

它可以从mysql数据库中获取数据,然后分词,对每个词语建立索引结构,可以理解成像下面这样的形式

比如,从mysql中获取到句子"我是中国人"

从这个内容中提取关键词,建立像下面这样的索引结构

关键词  此关键词出现文档编号(也就是mysql表中的主键值,对应就知道哪一行)

中国    8,9,10....

我      20,10...

什么样的词语作为关键词呢?"中国"还是"中国人"

所以就涉及到一个切词标准,切词方法又是一门细分领域的学科,分很多种切词算法。

因为sphinx是国外人编写的,默认只支持一元分词法,一元分词法就是:为每个字符都建立一个索引项(放在中文中就是每个汉字建立索引项)。

sphinx可以使用一元分词法,也就是每个汉字都作为关键词加入索引中去。

疑问:官方的sphinx默认是不是只支持一元分词法,或者是可以配置最小切割词语。比如配置最小字符是1,2,3,4。

有个min_word_len可以配置大于等于这个长度的单词才能被索引(联想mysql数据库中针对索引也有类似的设置)

比如设置长度为3,则句子中的"he is my wife",he 和my这两个单词不会建立索引。因为这两个单词长度为2。

使用一元分词法,将这个配置项设置为1才行。

一元分词法,不需要使用词典来分词,因为无非就是按照一个一个字符来切。由于涉及到中文分词,需要用到词典,分发版sphinx-for-chinese和coreseek将sphinx改成可以配置分词词典的方式了,也就是可以配置一个分词词典,使用这个词典里面的词语来作为分词标准。在这个词典里面出现的词语,就会被加入索引中去。

两种方式来使用sphinx的查询服务

第一种是直接使用sphinx提供的api接口来操作。

第二种是安装一个sphinxSE,这个可以看成是一个以mysql存储引擎嵌入mysql的sphinx客户端。最终由它来完成与sphinx服务器的请求。还可以实现sql关联查询。

我觉得还是使用api形式的方式比较灵活自由,相互独立起来,减少系统之间相互影响。这种还很方便做分布式sphinx服务器(安装多个sphinx服务端)

下面这张图是以前整理的文档中拿过来,不清楚从网上哪里来的了,因为2年前的学习了。

这次在公司生产环境,使用的是api的形式提供查询,这种情况是不需要安装sphinxSE存储引擎。

说道这个sphinx,以前一直不知道怎么读比较好。后来才知道读作:斯芬克斯。

斯芬克斯(sphinx)是希腊神话里一个带翼的怪物。这个软件取这个名字,不知道取其什么含义。

 

 

选择哪个分发版本

sphinx是俄罗斯人写的。对英文、俄文这样切词就比较好。但是对中文仍然是问题,里面内置的分词方法并不支持中文分词,这跟中文特殊性有关。一般中文分词,都需要专门的分词办法。国外的软件不会帮你做这方面。

因为sphinx是开源的,所以完全可以修改源码,于是有人就修改原版的sphinx,加上了自己适合中文分词的部分。

网上有人就建议了:暂时不要选择原版Sphinx(对中文分词的支持不是很好). Sphinx for chinese和coreseek建议这两个中选择一个。

我也是在linux上安装了原版的后,后面改用了sphinx-for-chinese。

sphinx-for-chinese在linux的安装过程,这里暂时不详细归纳了。重点归纳我在实际使用中,觉得需要注意的地方

关于配置文件:sphinx.conf

配置文件在安装目录的etc目录下面,如下

安装好后,会有如下几个目录

etc目录是配置文件放的目录,这是很多linux软件的一个约定习惯。

一般看到etc这个目录都会是配置文件目录

bin目录是一些辅助工具。服务进程程序searchd和索引操作工具indexer在这个目录下面。

1、启动sphinx服务

/data/installsoft/sphinx-for-chinese/bin/searchd  -c /data/installsoft/sphinx-for-chinese/etc/sphinx.conf

searchd是sphinx的服务进程。-c 后面指定sphinx服务启动时使用哪个配置文件。

不像其他软件那样,启动的时候需要手动指定端口,只要使用-c指定配置文件,配置文件中配置好了端口的。

2、建立索引

/data/installsoft/sphinx-for-chinese/bin/indexer -c /data/installsoft/sphinx-for-chinese /etc/sphinx.conf --all --rotate

使用”安装目录/bin/search”这个命令行工具来测试搜索某个词语。

search与searchd的区别:searchd是服务进程。官方提供search只是为了方便测试用的。这个程序使用的时候,并不依赖于searchd服务进程是否启动。只要索引数据存储就能使用。可以通俗理解,它是去读取索引文件获取搜索结果。

切词方式的选择

sphinx内置默认是支持一元分词法,也就是每个字符都建立索引项。

是一个没法完美的问题。一般也是多种分词方法结合起来。我当时使用的就是一元分词,因为数据量小,为每个汉字建立索引项,整个索引数据也小,省去折腾搜索不精准的问题了(每个汉字都建立了索引,无效的数据当然也是有的)。

sphinx服务端口

sphinx在版本0.9.9开始,官方已在IANA获得正式授权的9312端口,以前版本默认的是3312。

了解了切词方式,那么对sphinx的切词就会更加容易理解了。

本文未完待续,只表示当时的想法,以后还会完善

sphinx使用随笔的更多相关文章

  1. AI人工智能系列随笔

    初探 AI人工智能系列随笔:syntaxnet 初探(1)

  2. 【置顶】CoreCLR系列随笔

    CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...

  3. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  4. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  5. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  6. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

  7. 利用Python进行数据分析 基础系列随笔汇总

    一共 15 篇随笔,主要是为了记录数据分析过程中的一些小 demo,分享给其他需要的网友,更为了方便以后自己查看,15 篇随笔,每篇内容基本都是以一句说明加一段代码的方式, 保持简单小巧,看起来也清晰 ...

  8. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  9. 《高性能javascript》 领悟随笔之-------DOM编程篇

    <高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

随机推荐

  1. SAP GUI SAPLOGON.INI

    GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...

  2. Amazon的Fire Phone之于Android开发者

    在上周Amazon也耐不住加入了手机竞争行列之中,发布了自己的Fire Phone,于是Android家族又多了一位变种成员,Android系统的碎片化程度也进一步加剧.因为工作的关系,我有幸在上个月 ...

  3. 查看、关闭某一runlevel下自动启动的服务

    这些服务都在 /etc/init.d/ 目录下 1.查看 chkconfig --list | grep '3:on' Auditd - 安全审计工具: blk-availability 如果使用LV ...

  4. Android ListView OnItemLongClick和OnItemClick事件内部细节分享以及几个比较特别的属性

    本文转自 http://blog.sina.com.cn/s/blog_783ede030101bnm4.html 作者kiven 辞职3,4个月在家休息,本以为楼主要程序员逆袭,结果失败告终继续码农 ...

  5. 实现TabView(页签)效果

    今天花了点时间,设计了一个网页上用的tabview(页签.tabcontrol)效果.个人觉得实现得比较不错,网页元素用得比较少,js代码也比较精练.测试了一下支持IE.FireFox以及chrome ...

  6. 尝试在virtualbox fedora21 下安装additions和mount share folder

    安装这个additions的过程,基本上可以参照 http://gamblisfx.com/how-to-install-virtualbox-guest-additions-on-fedora-21 ...

  7. Android ActionBar Home按钮返回事件处理的两种方式

    今早无聊查看了一下android官方文档,最近对ActionBar很感兴趣,它确实对我们的日常开发起到了很便捷的作用. 对于通过点击ActionBar的Home按钮返回,以前我只知道有一种方式:也就是 ...

  8. 关于在for循环中绑定事件打印变量i是最后一次。

    其实函数引用的外部变量都是最后一次的值. <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. NPM使用详解(下)

    NPM使用详解(下) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impo ...

  10. mysql Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT

    使用mysql的时候,用到int类型的蛮多,需要注意一下: 1. 值的范围 Type Storage Minimum Value Maximum Value   (Bytes) (Signed/Uns ...