Blogger Information
Blog 11
fans 0
comment 0
visits 8167
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Sphinx--window操作笔记
一个人流浪
Original
1123 people have browsed it

一、sphinx的基本介绍

引入:

图片3.png图片4.png

 

 

解决方式: 使用sphinx来实现  英文的搜索问题(大文本)

1、使用背景

当对大文本数据进行单词匹配查询时,如:有一个歌曲网站,数据库中

收集着上百万首歌曲的信息,如果要查询出歌词中带“爱情”的所有歌

曲,典型的做法是执行如下SQL语句:

SELECT * FROM songs WHERE content LIKE "%爱情%"。

但是在MYSQL中以%开头的查询无法使用索引,所以这条SQL语句将执

行全表扫描,性能极差。MyISAM引擎中的全文索引是专门对文本创建

索引的,但对中文的支持不好。

好的解决方案:使用sphinx !

 

传统上的sphinx技术

 

 英文:1  today is monday ,the wearther is ranning;

       2  tomorrow  is  tuesday ,the wearther is  sunning;

 

  把整个文档按照空格进行分词,去掉一些修饰词(停词 比如 a is the 等),形成以下词组:   

       today  monday  weather  ranning   tomorrow  sunning

  把上面的单词进行创建索引

      关键字        所在的ID(主键且不为空)

  1    today          1

  2    monday        1

  3    weather        1,2

  4     ranning         1

  5    sunning         2

 

中文:  今天是星期一,天气下雨

        明天是星期二,天气晴

   中文没法进行分词

 

说明:sphinx分词技术只针对中文,不支持英文。

      今天所讲的sphinx并不是真正意义上的sphinx,而是结合中文的分词技术加上mmseg中文分词形成的一个叫做coreseek的软件技术来实现

 

2、sphinx(coreseek)的原理

第一步:对应数据源建立索引

 QQ截图20171218204211.png

中文分词技术,去掉停词(如 是、的、这个等)

今天             1

下雨             1

明天             1,2,3

学习             2

第二步:执行查询,返回查询到单词所在,mysql里面记录的id

php要把查询的单词给sphinx软件,软件拿到要查询的单词后,从索引里面进行匹配。返回该单词在mysql表里面记录的id

php拿到单词所在的id后,根据该id去mysql里面查找数据。

 

3、什么是Coreseek

Coreseek 是一款中文全文检索/搜索软件,基于Sphinx研发并独立发布,

专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索

数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景

 图片5.png图片6.png图片7.png图片8.png

 

 

二、开始安装执行

1、下载软件,解压后,拷贝到指定的目录

  下载 http://www.coreseek.com/ 地址

  图片9.png图片11.png图片11.png图片12.png

 

2、建立一个sphinx的配置文件。

 图片13.png

3、建立索引

分为三步走:

     配置数据源   配置索引  配置服务器端的信息。

(1)配置数据源(固定的某个表的数据)

语法:source   数据源的名字

在一个配置文件中,可以配置多个数据源的。

   图片14.png图片15.png

(2)针对数据源配置索引,

一个数据源对应一个索引的配置,

   图片16.png

(3)配置sphinx服务器端信息。

  图片17.png

4、根据sphinx.conf的配置,创建索引

 以管理员进入cmd 进入到sphinx/bin目录

语法

indexer  -c 配置文件    索引的名字

 图片18.png

 图片19.png

5、安装sphinx(coreseek)启动服务,

以管理员进入cmd进入到sphinx/bin目录,使用searchd.exe命令

语法:searchd  -c 配置文件  --install

 图片20.png

启动服务

默认的端口号是9312,

 图片21.png

 

总结:

(1)针对数据源建立索引,要配置的是数据源,数据源对应的索引,服务器端配置

  使用indexer命令完成索引的创建。

(2)启动sphinx的服务进行查询

(3)带上配置文件

三、使用php查询测试

  图片22.png图片23.png

 

四、SPHINX的匹配模型

1、SPH_MATCH_ALL 完全匹配所有的词(默认使用)

如“冬天  的   雪”,并不会匹配 “我爱冬天”,

但可以匹配 “我的朋友,爱冬天,和雪”。

因为“冬天的雪” 被分成 “冬天”,“的”,“雪”三个词,匹配条件是同时包含

这三个词,“我爱冬天”里只包含一个“冬天”

2、SPH_MATCH_ANY: 匹配任意一个词

如“冬天   的     雪”,并会匹配 “我爱冬天”。

"冬天的雪“ -》 ”冬天“ ”的“ ”雪“

因为“我爱冬天”里有一个“冬天”相匹配。

3、

 图片24.png

4、

图片25.png

5、

 图片26.png

六、增量索引建立

原来有1000万条记录,建立完成索引了,

后来又添加了500条记录,

思路:把后面添加的记录单独建立索引,建立的增量索引再合并到主索引上面。

具体实施:

(1)新建一张表,用于记录数据源表中最大的id,当主索引建完之后,表里面就记录最大的id,

(2)建立增量索引是主查询,就使用条件了。

 select id,title,description from dede_archives where id>(select max_id from a)

 图片27.png

步骤:

(1)新建一张表

create table a(max_id int);

 图片28.png

(2)修改主数据源

 图片29.png

(3)添加增量数据源

 图片30.png

(4)配置增量索引

 图片31.png

 

(5)重新建立主索引

  图片32.png

添加数据,进行建立增量索引

 图片33.png

图片34.png

(6)把增量索引合并到主索引上面

indexer  -c配置文件  --merge  主索引的名字  增量索引的名字  --rotate(不关闭服务强制合并)

 图片35.png

说明:以后有数据更新,只需要做以下步骤即可

 图片36.png

检测结果:之前的数据和后面添加的数据都使用到了sphinx全文检索

 图片37.png


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post