Coreseek/sphinx全文检索的了解

概述:

  全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书、整篇文章中的随意内容信息查找出来的检索。它能够依据须要获得全文中有关章、节、段、句、词等信息,也能够进行各种统计和分析。

定义:

  全文检索易龙天网的设计师觉得能够把它划分为二部分:

  全文

  全文顾名思义:就是全文检索的对象,它可能是一段话,也可能是一片文章,它可能是一个文件比方:word,txt也能是随意一种扩展名结尾的文件

  检索

  描文章中的每个词,对每个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时依据建立的索引查找,类似于通过字典的检索字表查字的过程。

  sphinx定义

  Sphinx是一个基于SQL的全文检索引擎,能够结合MySQL,PostgreSQL做全文搜索,它能够提供比数据库本身更专业的搜索功能,使得应用程序更easy实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同一时候为MySQL也设计了一个存储引擎插件。

  sphinx特点

  Sphinx 单一索引最大可包括1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引仅仅需 3~4分钟,创建1000万条记录的索引能够在50分钟内完毕,而仅仅包括最新10万条记录的增量索引,重建一次仅仅需几十秒

 sphinx搜索引擎架构图

  coreseek定义

  Coreseek为应用提供全文检索功能,眼下的版本号(2.x 3.x)基于Sphinx ,支持使用Python定义数据源,支持中文分词。

  这说明coreseek集合了sphinx的功能,支持很多其它的数据源,在字典,建立索引,分词更好的支持中文。能够这样理解,coreseek就是支持中文的sphinx全文检索

  coreseek数据源

  顾名思义:数据源就是为全文检索提供索引数据的源头,coreseek包含但不限制下面三种数据源

  l xml

  l mysql

  l python

  coreseek为了扩展,添加了python数据源功能,从而得以无限扩展Coreseek/Sphinx的数据获取功能由于Python眼下具备操作全部类型数据库的能力,从而coreseek也能够从随意一种数据库之中获取数据;当然,也支持从Python能够操作的随意其它数据来源获取数据。

  不同的数据源生成索引配置不一样,可是他们都是为生成索引提供数据的

  sphinx原理

  生成词典

  词库是以txt结尾的文件,而词典是以lib结尾的文件,词典是词库生成出来的,coreseek默认自带中文词库,我们也能够自己定义词库信息

  词典的构造:

  须要用到sphinx服务命令mmseg -u unigram.txt,该命令运行后,将会在unigram.txt所在文件夹中产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完毕词典的构造。须要注意的是,unigram.txt须要预先准备,而且编码格式必须为UTF-8编码。

  词典文件格式:

  河 187

  x:187

  造假者 1

  x:1

  台北队 1

  x:1

  湖边 1

  第一行为词项,其格式为:[词条] [词频率]。特别提醒,有的编辑器会使用4到8个空格代表 ,这将导致该词条无法解析。须要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率须要在大量的预先切分好的语料库中进行统计,用户添加或删除词时,一般不须要改动这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是因为LibMMSeg库的代码是从Coreseek其它的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频率。LibMMSeg的用户仅仅须要简单的在第二行处填"x:1"就可以。

  用户能够通过改动词典文件添加自己的自己定义词,以提高分词法在某一详细领域的切分精度

  当我们配置好mysql数据源时候,sex字段数据将以属性字段存储在索引,而name字段将以全文检索字段存储在索引表里,生成索引须要用到词典表,当我们词库里设置的分词格式是:

  小红 1

  x:1

  小明 1

  x:1

  生成的索引表为

  词库分词格式我们没有特殊设置小红,小明时候:词库依照默认规则 把小 和 明 小 和 红 单字拆分生成索引

  生成的索引表为:

  搜索原理

  还是以mysql数据源数据举例,当我们生成完索引进行搜索:

  以“小明红”进行搜索时候,keyword会先依据词库拆分,默认咱们以上面第二中分词格式,拆分的得到的词为“小”,“红”,“明”,然后以拆分的词在索引表里查询数据,得到的结果是

  sphinx基本工作流程

  过滤关键词

  为关键词过滤一些特殊字符,通过sphinxAPI自带方法,结合字典把关键词进行分词,而且过滤一些特殊字符,过滤后在把拆分的词再拼接起来进行检索,比如:百度搜索

  百度会自己主动把@&特殊字符过滤掉,再进行搜索,从而不影响搜索结果

  设置filter

  sphinx索引里的两种字段

  在sphinx里有两种字段,一种能够理解为属性字段,一种能够理解为索引字段,属性字段就是以数值形式存储在索引数据里的字段,它包含不能用来索引,这样的类型的字段一般都是用来设置filter、以及做排序,另一种全文检索字段就是以字符形式存储在索引数据里,这样的类型的字段一般都用来进行分词,比如文章内容,文章标题,等以字符形式存在的数据。以下就是索引里字段的介绍

  Coreseek索引配置:

  id         :ID属性,必须提供,在SQL语句中字段名称不限

  相应SQL查询的第一个字段,系统自己主动使用,内部属性名为@id,不须要也不能在配置中设定

  使用SetFilter()过滤,或者使用SetIDRange()过滤;

  SphinxSE之中,使用filter或者minid, maxid过滤

  sql_attr_uint   :整数属性,以上group_id、date_added都可用此设置,使用SetFilter()过滤,

  或者使用SetFilterRange()过滤;

  SphinxSE之中,使用filter或者range过滤;

  sql_attr_float   :浮点数属性,以上score可用此设置,使用SetFilterFloatRange()进行范围过滤,

  SphinxSE之中,使用range过滤;

  sql_attr_timestamp:timestamp属性,整数,以上date_added可用此设置,可用SetFilter()过滤

  或者使用SetFilterRange()过滤;

  SphinxSE之中,使用filter或者range过滤

  sql_attr_str2ordinal:字符串序列属性,以上title可用此设置,仅用于依据该字段排序

  可是设置后,该属性不可用于过滤,也不会保存实际字符串内容,更不能全文检索

  搜索结果中,其相应的信息为整数,由系统计算出来的排序序列值

  全文检索字段   :全文检索字段,以上title、content等字符串或者文本的字段都可用此设置

  不论什么出如今SQL语句中,既不是ID属性,也没有使用“sql_attr_类型”设置的字段,都是全文字段,

  使用Query()搜索;

  SphinxSE之中,使用query的查询文本进行搜索

  filter

  设置filter就是针对属性字段过滤,依照上面的mysql数据源表进行分析:仅仅搜索男生数据,须要在sphinx搜索之前,过滤掉女生数据,这就须要在生成索引配置把sex字段设为索引的属性字段,这样就能够在搜索之前进行过滤,而不是在搜索之后再过滤,从而加快了sphinx搜索速度。

  设置范围(limit)

  相当于mysql数据库搜索时候的limit,也就是设置一个返回数据范围,当从索引搜索出来的数据为100时候,可是我仅仅想要前10条,这就须要用到设置limit

  设置权重(须要时候设置)

  为字段设置权重,比方 name (char) body(text) 字段假设把这两个字段都生成索引,我们为name设置权重高,那么当我们为搜索返回的值设置排序的时候能够依照权重排序,这样两条数据,第一条数据name字段存在搜索的keyword,第二条数据body存在搜索的keyword,设置权重排序,由于我们为字段name设置权重高,排序第一条数据要优先于第二条数据

  设置排序

  sphinx默认提供6种排序方式,详细请查看相关资料,在这里我给大家介绍按一种类似SQL的方式将列组合起来,升序或降序排列,方式

  @weight DESC,content_hit desc,@id ASC

  增加“@”代表此字段是sphinx提供的字段,不加“@”代表是数据源提供的字段,上面一句代码的意思是:

  先依照权重进行倒序,然后依照其它数据源提供的字段排序,这里用到的数据源字段 都是索引里的属性字段,属性字段上面已经和大家说过了。

  设置搜索表达式

  我们能够设置keyword在索引里每个全文检索字段里进行查找,也能够针对某一个全文检索字段查找。例:

  1、Query($keyword,$index,true);

  2、Query("@name ({$keyword})",$index,true);

  返回索引查询得到的ID数组

  query运行后,检索完毕,sphinx会为我们返回数组形式的值,值不仅包含搜索的一些相关信息,假设搜索到数据还会返回以二维数组形式存在的数据,二维数据包含 ID 相应数据源里数据的唯一标示字段(如 主键ID),以及一些索引里存储的属性字段

  查询数据库

  通过上面得到的二维数据,获得ID,通过它能够在数据源查询相应的相关信息

  给查询出来的数据高亮显示

  查询出相关信息,为相关信息中的keyword进行高亮处理

  . 应用

  搜索引擎

  百度、谷歌等搜索引擎

  随着网民对互联网的需求越来越多,网民查看新闻、信息的方式发生转变,搜索引擎的出现,改变了网民网上查看新闻、信息的浏览习惯。试想当不存在搜索引擎当不存在全文检索,我们在网上查找东西是多么费事的一件事情啊!

  智能机器人

  全文检索为智能化的推进提供了优秀的解决方式,智能机器人的出如今WEB,电视,手机等领域已经广泛应用。


相关CSDN/websites Coreseek/sphinx文章:

sphinx下BuildExcerpts的使用

sphinx设置多属性过滤的方法(setFilter)

谢谢关注websites博客!