zoukankan      html  css  js  c++  java
  • 搜索引擎

    Sphinx是什么

    Sphinx是一个全文检索引擎。

    Why/为什么使用Sphinx

    遇到的使用场景

    遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文章的内容,而文章的标题和文章的内容分别保存在不同的库,而且是跨机房的。

    可选方案

    A、直接在数据库实现跨库LIKE查询

    优点:简单操作 缺点:效率较低,会造成较大的网络开销

    B、结合Sphinx中文分词搜索引擎

    优点:效率较高,具有较高的扩展性 缺点:不负责数据存储

    使用Sphinx搜索引擎对数据做索引,数据一次性加载进来,然后做了所以之后保存在内存。这样用户进行搜索的时候就只需要在Sphinx服务器上检索数据即可。而且,Sphinx没有MySQL的伴随机磁盘I/O的缺陷,性能更佳。

    Sphinx的工作原理

    Sphinx的整个工作流程就是Indexer程序到数据库里面提取数据,对数据进行分词,然后根据生成的分词生成单个或多个索引,并将它们传递给searchd程序。然后客户端可以通过API调用进行搜索。

    Sphinx工作流程图:

    流程图解释:

    • Database:数据源,是Sphinx做索引的数据来源。因为Sphinx是无关存储引擎、数据库的,所以数据源可以是MySQL、PostgreSQL、XML等数据。
    • Indexer:索引程序,从数据源中获取数据,并将数据生成全文索引。可以根据需求,定期运行Indexer达到定时更新索引的需求。
    • Searchd:Searchd直接与客户端程序进行对话,并使用Indexer程序构建好的索引来快速地处理搜索查询。
    • APP:客户端程序。接收来自用户输入的搜索字符串,发送查询给Searchd程序并显示返回结果。

    Sphinx的配置

    数据源配置

    source test  //source后面跟着的是数据源的名字,后面做索引的时候会用到;

    {
          type                    = mysql                //type:数据源类型,可以为MySQL,PostreSQL,Oracle等等;
      
          sql_host                = 127.0.0.1
          sql_user                = root
          sql_pass                = root
          sql_db                  = test
          sql_port                = 3306    # optional, default is 3306
      
          sql_query_pre           = SET NAMES utf8         //sql_query_pre:定义查询时的编码
          sql_query            = SELECT id, name, add_time FROM tbl_test    //sphinx除了主键和属性,其他的都可以做索引
      
          sql_attr_timestamp      = add_time  //索引属性,时间戳,

      #sql_attr_uint = media_type_u    //索引属性,整形
      sql_attr_uint = role      
      #sql_attr_string = tokens    //索引属性,字符串

        
       sql_query_info_pre      = SET NAMES utf8        //设置查询编码,如果在命令行下调试出现问号乱码时,可以设置此项;
            sql_query_info          = SELECT * FROM tbl_test WHERE id=$id   //设置命令行下返回的信息。
    }

    索引配置

    index test_index             //index后面跟的是索引名称

    {
         source                    = test         //source:数据源名称;
         path                      = /usr/local/coreseek/var/data/test        //每个索引存在的地址都不能一样!!!!,我们可以在建个文件夹,放
         docinfo                   = extern                //索引文档属性值存储模式;
         charset_dictpath          = /usr/local/mmseg3/etc/        //中文分词时启用词典文件的目录,该目录下必须要有uni.lib词典文件存在;
         charset_type              = zh_cn.utf-8            //数据编码类型;
         ngram_len                 = 1                 //分词长度;
         ngram_chars               = U+3000..U+2FA1F        //要进行一元字符切分模式认可的有效字符集。
    }

    sphinx使用配置文件从数据库读出数据之后,就将数据传递给Indexer程序,然后Indexer就会逐条读取记录,根据分词算法对每条记录建立索引,分词算法可以是一元分词/mmseg分词。

    什么是增量索引

    在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我们会发现,每天我们需要更新的数据相比较而言较少,在这种情况下我们就需要使用“主索引+增量索引”的模式来实现实时更新的功能。

    这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。


    php扩展下载
    http://pecl.php.net/package/sphinx/1.3.3/windows

    基本命令:
    启动服务
    searchd.exe
    searchd.exe -c shpinx.conf

    重建主索引 (xiaoheiban_log 这个索引定义为 index, 在shpinx.conf中)
    indexer -c sphinx.conf xiaoheiban_log --rotate

    建立增量索引 (xiaoheiban_log_delta 这个索引定义为 index, 在shpinx.conf中)
    indexer -c sphinx.conf xiaoheiban_log_delta --rotate

    增量合并(可以在启动searchd下直接合并增量)
    indexer --merge xiaoheiban_log xiaoheiban_log_delta --rotate



  • 相关阅读:
    日钢信息自动化质保书打印系统应用实践《全国冶金自动化信息网2012年年会论文集》2012年
    MySQL :: MySQL 5.0 Reference Manual :: 20.1.4.5 Configuring a Connector/ODBC DSN on Unix
    Fast JavaScript Max/Min
    js javascript:void(0)
    dom querySelector
    php输出Json
    精通javascript:永不终止的blog
    javascript事件委托event delegation
    js+css Text Blocks Over Image(文字覆盖在图片上)
    一个javascript选项卡的进化史
  • 原文地址:https://www.cnblogs.com/mlls/p/7682289.html
Copyright © 2011-2022 走看看