laiyuquan

博客

sphinx 全文检索

作为技术博客之旅的第一篇文章,今天分享一篇全文搜索。

理解概念篇:

what:

建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)

  • 创建索引:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
  • 搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。

什么是索引?

从非结构化数据中提取出的然后重新组织的信息;举个例子:字典是非结构的数据,字典的拼音表和部首检字表就相当于索引

why:

全文搜索相对于顺序扫描的优势之一:一次索引,多次使用

简而言之:提升非结构化数据的查询性能

how:

  • sphinx+coresesk(分词);
  • elasticsearch + ik(分词);
  • mysql 5.7 版本   innodb引擎   使用插件ngram;
  • mysql低于5.7版本 复制新表myisam 存储单个中文单词(程序控制) 再进行 full text 索引;
  • solr、lucene…

实战篇:

本篇主要记录sphinx + coreseek(分词) 如何进行全文检索:

下载与安装 :

下载:coreseek-4.1-beta (网上下载进行解压)

安装mmseg-3.2.14

  • cd mmseg-3.2.14
  • ./bootstrap
  • ./configure –prefix=/usr/local/mmseg3
  • make
  • sudo make install

如遇到的问题:
error: cannot find input file: src/Makefile.in
或者遇到其他类似error错误时…

解决方案:
依次执行下面的命令:

  • sudo apt install autoconf automake
  • aclocal
  • sudo apt install libtool
  • aclocal
  • libtoolize –force
  • automake –add-missing
  • autoconf
  • autoheader
  • make clean

安装coreseek(sphinx)

  • cd csft-4.1/
  • sh buildconf.sh
  • ./configure –prefix=/usr/local/coreseek –without-unixodbc –with-mmseg –with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ –with-mmseg-libs=/usr/local/mmseg3/lib/ –with-mysql
  • make  && sudo make install

可能遇到的问题:

ubuntu 16.04及以上版本需要打补丁,否则下面编译的时候会没有configure文件。

补丁解决方案如下:

1、在 csft-4.1/buildconf.sh 文件中,查找   && aclocal \  后加上  && automake –add-missing \

2、在 csft-4.1/configure.ac 文件中,查找:AM_INIT_AUTOMAKE([-Wall -Werror foreign]) 改为:AM_INIT_AUTOMAKE([-Wall foreign])

查找:AC_PROG_RANLIB   后面增加  AM_PROG_AR

3、在 csft-4.1/src/sphinxexpr.cpp 文件中, 替换所有:

T val = ExprEval ( this->m_pArg, tMatch ); 成为:

T val = this->ExprEval ( this->m_pArg, tMatch ); 总共应该有三处需要替换

4、安装libmysqlclient15-dev,否则会报找不到mysql   ; sudo apt-get install libmysqlclient15-dev

总之在安装的过程中,总是会遇到各种各样的问题。针对问题,具体google解决吧!(这个包 就是这么让人无语)

sphinx配置文件(核心

在 /usr/local/coreseek/etc  下创建 csrf.conf,并配置信息如下:

source dxywisdom
{
        type                    = mysql

        sql_host                = your_db(如果是本机 填localhost)

        sql_user                = your_user

        sql_pass                = your_psd

        sql_db                  = your_db

        sql_port                = 3306  

        #sphinx 在取数据之前执行的SQL语句

        sql_query_pre = SET NAMES utf8

        #indexer 创建的索引数据

        sql_query               = \

                SELECT id, content, answer_content, community_id FROM clg_themes where status=1 and is_reply in(-1,1)

        #属性 用来进行过滤 && 排序

        sql_attr_uint           = community_id

        #sql_attr_timestamp     = date_added

        #index 以后会执行的sql语句  记录当前最大id值,并与后续的增量索引查询

        sql_query_post = UPDATE clg_sphinx_id SET id=(SELECT MAX(id) FROM clg_themes);

}

#索引

index dxywisdom

{
        source                      = dxywisdom

        path                         = /usr/local/coreseek/var/data/dxywisdom  #索引的数据目录

        docinfo                    = extern

        min_word_len      = 1

        charset_dictpath  = /usr/local/mmseg3/etc/

        charset_type         = zh_cn.utf-8

}

#增量数据源

source dxywisdom_delta
{
        type = mysql

        sql_host = mysql_host (如果是本地 填localhost)

        sql_user = your_user

        sql_pass = your_psd

        sql_db    = your_dbname

        sql_port = 3306     

        #sphinx 在取数据之前执行的SQL语句

        sql_query_pre = SET NAMES utf8

         #indexer 创建的索引数据

         sql_query = \

         SELECT id, content, answer_content, community_id FROM clg_themes where status=1 and is_reply in(-1,1) and id>(SELECT id                  FROM clg_sphinx_id) 

         #增量索引需要创建clg_sphinx_id 表 记录每次索引更新的id

         #属性 用来进行过滤 && 排序

         sql_attr_uint = community_id

         #sql_attr_timestamp = date_added

         #index 以后会执行的sql语句

        sql_query_post = UPDATE clg_sphinx_id SET id=(SELECT MAX(id) FROM clg_themes)

}

#增量索引
index dxywisdom_delta
{
        source = dxywisdom_delta

        path = /usr/local/coreseek/var/data/dxywisdom_delta 

        docinfo = extern

        min_word_len = 1

        charset_dictpath = /usr/local/mmseg3/etc/

        charset_type = zh_cn.utf-8

}

indexer
{
        mem_limit               = 128M #分配的内存
}

searchd
{
        listen                = 9312

        log                   = /usr/local/coreseek/var/log/searchd.log

        query_log             = /usr/local/coreseek/var/log/query.log

        read_timeout          = 5

        max_childre           = 30

        pid_file              = /usr/local/coreseek/var/log/searchd.pid

        max_matches           = 1000 #默认最大取出的数据

        seamless_rotate       = 1

        preopen_indexes       = 1

        unlink_old            = 1

        workers               = threads # for RT to work

        compat_sphinxql_magics = 0
}
创建索引:(初始化创建,初始化即主索引)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf –all –rotate
增量索引:(后续每次执行增量索引即可)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf dxywisdom_delta –rotate
合并索引:(然后将增量索引 合并到主索引)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf –merge dxywisdom dxywisdom_delta –rotate –merge-dst-range deleted 0 0
添加定时脚本:
启动sphinx 服务 默认监听9312端口

 /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
然后再linux 上使用 crontab -e,添加如下定时脚本

*/30 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf dxywisdom_delta --rotate && /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --merge dxywisdom dxywisdom_delta --rotate --merge-dst-range deleted 0 0

在终端进行查询 :/usr/local/coreseek/bin/search 提问


接下去这篇说明:PHP如何连接sphinx服务,进行全文搜索

点赞

发表评论