Sphinx 全文检索引擎的搭建以及python调用例子

原创
2017/02/14 19:22
阅读数 2.2K

提要:本来之前一直都是使用whoosh作为全文搜索,后面在使用的过程愈发的发现这个东西的搜索并不特别的完美。并且生成的索引量又十分巨大。所以考虑换一个,最后选了sphinx来作为新的搜索。而且网上的安装例子都并不是很全。因此做下记录。

介绍

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

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

Sphinx的主要特性包括:

高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查询速度不到0.1秒); 高可用性 (单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名 支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码

  • 1、安装包的准备


    sphinx:https://github.com/eric1688/sphinx (我采用的是sphin-for-chinases支持中文搜索)

    xdict :http://pan.baidu.com/s/1czkGO2 密码:kouv (下载这个分词工具可能需要梯子,因此我直接常上传百度云)

    shpinxapi: https://github.com/feeen/sphinxapi/blob/master/sphinxapi/init.py (这个是python调用shpinx的API。直接拿过来导入就可以使用)

  • 2、安装sphinx

    • 首先安装mysql

       apt-get -y install mysql-server libmysqlclient-dev
       updatedb
      
  • 安装sphinx

      git clone https://github.com/eric1688/sphinx 
      cd sphinx 
     ./configure --prefix=/usr/local/sphinx
      make -j2 && make install 
    
  • 3、配置中文支持 tar xf xdict_1.1.tar.gz /usr/local/sphinx/bin/mkdict xdict_1.1.txt xdict mv xdict /usr/local/sphinx/etc/

  • 4、修改配置文件 cp sphinx.conf.dist sphinx.conf vim sphinx.conf source posts { type = mysql sql_host = 127.0.0.1 sql_user = test sql_pass = test sql_db = test sql_port = 3306 # optional, default is 3306 sql_sock = /var/run/mysqld/mysqld.sock sql_query = SELECT id, post_title FROM test sql_query_pre = SET NAMES utf8 # sql_attr_uint = id sql_field_string = post_title sql_ranged_throttle = 0 } index test1 { source = posts # 索引文件的存放位置
    path = /usr/local/sphinx/var/data/posts 文件存储模式(默认为extern)
    docinfo = extern
    #缓存数据内存锁定
    mlock = 0
    # 马氏形态学(对中文无效)
    morphology = none
    # 索引词最小长度
    min_word_len = 1
    # 数据编码(设置成utf8才能索引中文,最新版本的sphinx不支持这个参数)
    # charset_type = utf-8
    # 中文分词词典
    chinese_dictionary = /usr/local/sphinx/etc/xdict
    # 最小索引前缀长度
    min_prefix_len = 0
    # 最小索引中缀长度
    min_infix_len = 1
    # 对于非字母型数据的长度切割 ngram_len = 1 # 对否对去除用户输入查询内容

      html_strip = 0 
    
      }
      # 索引器设置   
      indexer   
          {   
      # 内存大小限制 默认是 32M, 最大 2047M, 推荐为 256M 到 1024M之间   
      mem_limit = 256M   
      }
      # sphinx服务进程search的相关配置   
      searchd   
      {   
      # 监测端口及形式,一下几种均可,默认为本机9312端口   
      # listen = 127.0.0.1   
      # listen = 192.168.0.1:9312   
      # listen = 9312   
      # listen = /var/run/searchd.sock 
    
      # search进程的日志路径
      log = /usr/local/sphinx/var/log/searchd.log   
      # 查询日志地址   
      query_log = /usr/local/sphinx/var/log/query.log   
      # 读取超时时间   
      read_timeout = 5   
      # 请求超时市时间   
      client_timeout = 300   
      # searche进程的最大运行数   
      max_children = 30   
      # 进程ID文件   
      pid_file = /usr/local/sphinx/var/log/searchd.pid   
      # 最大的查询结果返回数 (这个参数新版本不支持)   
      #max_matches = 1000   
      # 是否支持无缝切换(做增量索引时需要)   
      seamless_rotate = 1   
      # 在启动运行时是否提前加载所有索引文件   
      preopen_indexes = 0   
      # 是否释放旧的索引文件   
      unlink_old = 1   
      # MVA跟新池大小(默认为1M)   
      mva_updates_pool = 1M   
      # 最大允许的网络包大小(默认8M)   
      max_packet_size = 8M   
     # 每个查询最大允许的过滤器数量(默认256)   
     max_filters = 256   
     #每个过滤器最大允许的值的个数(默认4096)   
      max_filter_values = 4096   
      # 每个组的最大查询数(默认为32)   
      max_batch_queries = 32   
      }   
      # Sphinx配置文件结束 
    
  • 5、增加索引 /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf test1 如果有多个索引就使用参数--all /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all

  • 6、开启守护进程 /usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf 如果重建索引时守护进程正在运行,需要运行下面的指令 会重建索引并且重开守护进程 /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate

##这样一来就基本配置完成了,然后下面这个简单的demo就是用python来调用sphinx达到查询 import sphinxapi spc = sphinxapi.SphinxClient() spc.SetServer(str('127.0.0.1'),9312) spc.SetMatchMode(sphinxapi.SPH_MATCH_ANY) spc.SetLimits(0,5) res = spc.Query('星巴克') print res

总结:sphinx的查询功能确实很强大,速度也挺快。并且索引的空间并不会非常大。后续的话会继续研究这个东西。

展开阅读全文
打赏
1
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
1
分享
返回顶部
顶部