Coreseek/sphinx全文检索的了解-飞外
这说明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/websitesCoreseek/sphinx文章:sphinx下BuildExcerpts的使用
sphinx设置多属性过滤的方法(setFilter)谢谢关注websites博客!
热门阅读
- 龙门古镇在哪里 0人看过
- 鸡蛋里面白色的东西是什么 0人看过
- 金桔核能吃吗 0人看过
- 生姜从地里挖出来后如何储存 0人看过
- 生蚝怎么存放过夜不死 0人看过
- 豆腐长黑毛还可以吃吗? 0人看过
- 3077代表什么 0人看过
- 茶里有咖啡因吗 0人看过
- 车厘子冷藏能放多久 0人看过
- 冬天水管子冻了怎么办 0人看过