Sphinx全文检索


什么是全文检索

结构化数据:指具有固定格式或有限制长度的数据,如数据库,元数据等

非结构化数据:指没有固定格式或不定长的数据,非结构化数据还有一种叫法:全文数据。如邮件,word文档等

对结构化数据的收索:sql语句,再如对windows的收索:文件名,类型,修改时间。

对非结构化数据的收索:如windows对文件内容的收索,linux下的grep命令,再如googlebaidu可以收索大量内容数据

全文检索分成两种:顺序扫描和索引扫描。

顺序扫描:如要找到内容包含某个字符串的文件,会一个文档一个文档的从头到尾地找,如like查找。

索引扫描:把非结构化数据中的内容提取出来一部分重新组织,让它变成有结果化,这部分我们提取出来的数据就叫索引。

全文检索大体分成两个过程:索引创建(indexing)和收索索引(search)

索引创建:将现实世界中所有的结构化和非结构化的数据提取信息,创建索引的过程。

收索索引:就是得到用户的查询请求,收索创建的索引,然后返回果的过程。


Sphinx的优点

        Sphinxsql phrase index(查询词组索引)的缩写,sphinx是一个基于sql的全文检索索引,sphinx全文检索引擎,coreseek支持中文分词的全文检索引擎

wKiom1NGKJPw7sGdAAEDWNnQBuE855.jpg

wKioL1NGKGvzU_t9AAA88o5lF7Q379.jpg

        Sphinx创建索引过程:

一些需要创建索引的文档(documents)

将文档传给分词组件(tokenizer)

将得到的词元(token)传给语言处理组件(LinguisticProcessor)

将得到的词(term)传给索引组件(indexer)

wKioL1NGKJHDNOvCAAE0fZWS8lE697.jpg

wKiom1NGKLrxGPz0AACTBIY1vQM014.jpg

wKioL1NGKJLi-RGxAAElYXlTMzE906.jpg

        Sphinx收索索引过程

用户输入查询语句

对查询语句进行词法解析,语法分析,及语言处理

搜索索引,得到符合语法树的文档

根据得到的文档和查询语句的相关性,对结果进行排序

wKiom1NGKNvh3p9aAACHFKzu0Ds922.jpg


什么是中文分词

什么时候使用sphinx


Sphinx实验手册

环境准备

        Linux-5.5mysql-5.1 apache-2.2.9 php5.2.6

Sphinx-0.9.9-releasehttp://www.sphinxsearch.com/downloads/sphinx0.9.9.tar.gz

coreseek-3.2.14.tar.gz中文分词

sphinx-1.1.0.tgzphp里的模块

准备mysql数据

                  Createtable post(

Id int unsigned auto_increment primary key,

Title varchar(200),

Content text);

                  Insertinto post(Id,Title,content) values (“linux”,”linux1234567”,”linux is good”);

                  Insertinto post(Id,Title,content) values (“windows”,”windows1234567”,”windows isbad”);

                  Insertinto post(Id,Title,content) values (“freebsd”,”freebsd1234567”,”freebsd is verygood”);

安装sphinx

        Tarxzf sphinx0.9.9.tar.gz

        Cdsphinx0.9.9

        ./configure--prefix=/usr/local/sphinx –with-mysql=/usr/local/mysql

        Make&& make install

简单测试sphinx

        Sphinxbin/中有三个主要命令,indexer创建索引,searchd启动进程命令,search搜索命令。

配置sphinx

                  Cpsphinx.conf.dist sphinx.conf

                  Vimsphinx.conf (配置文件结构主数据源source main{}; 增量数据源source delta:main{}; 主数据索引index main{}; 增量数据索引index delta:main{}; 分布式索index dist1{}; 索引器indexer{}; 服务进程searchd{})


Source src1{

Type = mysql

Sql_host = localhost

Sql_user = root

Sql_pass = 123

Sql_db = post

Sql_port = 3306

Sql_sock = /tmp/mysql.sock

Sql_query_pre = SET NAMES UTF8

Sql_query_pre = SET SESSION query_cache_type = OFF

Sql_query = SELECT Id,Title,Content FROM post

#sql_attr_uint = group_id   #order

#sql_attr_timestamp= data_added #order

Sql_query_info = SELECT * FROM post WHERE Id=$Id

}

                 Source srclthottled:src1 #继承主数据源


Index text1{

Source = src1

Charset_type = utf-8

Charset_table =

                                    Path= /var/data/test1

}

增量数据源加注释::setnu  :480,484s/^/#/g

分布式加注释: 491,522s/^/#/g

                  Indexer{

mem_limit = 100

}

创建索引

命令是indexer

                  -c 指定配置文件

                  --all 对所有索引重新编制索引

                           --rotate用于轮换索引,在不停止服务的时候,增加索引

                           --merge合并索引

                           /usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx.conf –all

wKiom1NGKPjRYD7KAABZHCJEuQw270.jpg

wKioL1NGKM-jinR3AAA5w1uM_00353.jpg

测试搜索

指令search

                           /usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf linux

/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.confwindows

                           /usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf freebsd

                           /usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf “linux windows freebsd”


Coreseek


Coreseek 是带有中文分词的sphinxcoreseek提供了为sphinx设计的中文分词包libmmseglibmmseg包含了mmseg中文分词


下载coreseek http://www.coreseek.cn

解压安装

                  Tarxzf coreseek-3.2.14.tar.gz

                  Cdcoreseek-3.2.14/mmse-3.2.14/

                  ./configure--prefix=/usr/local/mmseg (会有error,继续使用automake)

                  Automake

                  Make&& make install

Cd csft-3.2.14/

./configure --prefix=/usr/local/coreseek–with-mysql=/usr/local/mysql –with-mmseg=/usr/local/mmseg–with-mmseg-includes=/usr/local/mmseg/include/mmseg –with-mmseg-libs=/usr/local/mmseg/lib

Make && make install

配置带有中文分词的sphinx配置文件

                  Cd/usr/local/coreseek/etc/

                  Cpsphinx.conf.dist csft.conf

                  Vimcsft.conf

大部分与以上的配置一样,以下是不太点

                           Charset_type= zh_cn.utf-8

                           Chatset_dictpath= /usr/local/mmseg/etc/ 安装mmseg的目录

测试

创建索引

/usr/local/coreseek/bin/indexer –c /usr/local/coreseek/etc/csft.conf–all

/usr/local/coreseek/bin/search [-a] –c  /usr/local/coreseek/etc/csft.conf ‘云络科技


php去使用sphinx技术


使用php程序操作sphinx做一个搜索引擎


        Sphinx集成到php程序中,有两种方式:sphinxphp模块 sphinx(coreseek源码api)


准备数据

建立sphinx配置文件

生成索引

启动searchd服务必须开启sphinx端口9312

php客户程序去连接sphinx服务


启动进程命令:searchd

                                    -c--stop --pidfile –p选项注意端口不要被占用


方法一Php加载sphnx模块

        Wgethttp://pecl.php.net/get/sphinx-1.1.0.tgz

        Tarzxf sphinx-1.1.0.tgz

        Cdsphinx-1.1.0

        /usr/local/php/bin/phpize

        ./configure--with-php-config=/usr/local/php/bin/php-config --with-sphinx

提示

        Checking for libsphinxclient headers in default path…. Notfind

Configure error: cannot find libsphinxclientheaders

Cd coreseek-3.2.14/ csft-3.2.14/api/libsphinxclient/

./configure

Make && make install

再继续加载sphinx模块

Cd sphinx-1.1.0

./configure --with-php-config=/usr/local/php/bin/php-config--with-sphinx

Make && make install

Vi /usr/local/php/etc/php.ini

Extension = sphnx.so 添加

/usr/local/apache2/bin/apachectl restart

方法二使用api类连接sphinx

        Cp/tmp/coreseek-3.2.14/csft-3-2.14/api/sphinxapi.php /usr/local/apache2/htdos/

Include ‘sphinxapi.php’

$sphinx = new SphinxClient();

$sphinx->SetServer(“localhost” 9312);

$result = $Sphinx->query($keyword,”*”);

Print_r($result);

[matches]=>Array

        [6]=>Array

                  [weight]=>4

                  [attrs]=>Array

                           [group_id]=>1

                           [data_added=>13801380999]






Index.php

wKiom1NGKRDQ49sLAABUUD6Dyz4635.jpg

Find.php

wKiom1NGKTqCQkdYAAGam6CLhj4668.jpg

wKioL1NGKRKCXdhlAADEagj3sZc176.jpg

wKiom1NGKTrzV0uhAABVtfa31KU002.jpg

wKioL1NGKRKTbqShAAB4hI1NiDA179.jpg

当数据量大时实现实时索引


数据库里的数据很大,然后我们在加入的记录,希望能够立即检索到,全部重新建立索引很消耗资源,这就需要使用主索引+增量索引,实现原理是设置两个数据源和两个索引。


1、创建一个计数器

在数据库里增加一个计数表,记录将文档分成两个部分的文档ID,每次从重新构建主索引时,更新这个表。

create table sph_counter(

counter_id INTEGER AUTO_INCREMENT PRIMARYKEY NOT NULL,

max_doc_id INTEGER NOTNULL );

2、再次修改配置文件

主数据源继承数据源主索引继承索引(增量索引)


主数据源

source main {

sql_qurry_pre = replace into sph_counter select 1,max(id) from post

sql_query = select id,title,content from post where id<=(selectmax_doc_id from sph_counter where counter_id = 1)

}

增量数据源

source delta : main {

sql_query_pre = set names utf8

sql_query = select id,title,content from post where id>(selectmax_doc_id from sph_counter where counter_id=1)

}

主索引

Index main{

Source main

Path = /usr/local/coreseek/var/data/main

}

继承索引(增量索引)

Index delta:main{

Source=delta

Path=/usr/local/coreseek/var/data/delta

}


测试

./indexer --all --rotate (max_doc_counter更新)

./indexer --delta --rotate

Mysql post 添加一条记录

./indexer --delta –rotate (max_doc_counter不变)


添加到计划任务里


Main.sh

#/bin/bash

/usr/local/coreseek/bin/indexer main --rotate>>/usr/local/coreseek/var/log/main.log

echo “####################################################”


Delta.sh

#/bin/bash

/usr/local/coreseek/bin/indexer delta --rotate>>/usr/local/coreseek/var/log/delta.log

echo “####################################################”


Chmod +x main.sh delta.sh


Crontab -e

*/10 * * * * delta.sh

00 2 * * * main.sh

Crontab –l


分布式索引

对大数据提高搜索速度,把搜索分布到多个服务器上(mysql数据库的操作)

对数据水平分区

过程

1连接远程代理

2 执行查询

3 对本地索引进行查询

4接收来自远程代理的收索结果

5 得到结果合并

6 将合并的结果返回给客户端

Index dist{

Type = distributed

Local = chunk0

Agent = localhost:9312:chunk1

Agent = 10.0.0.2:9312:chunk2

Agent = 10.0.0.3:9312:chunk3

}