Sphinx+PHP搜索服務

CecileCerva 8年前發布 | 11K 次閱讀 Sphinx 搜索引擎

來自: http://my.oschina.net/xtfjt1988/blog/610864


    隨著自己電影網站資源逐漸增多,增加電影資源搜索服務成為必然。直接操作數據庫的搜索,IO口請求增多減低了搜索性能。之前項目中有sphinx的使用基礎,加之支持中文檢索服務,最后決定采用基于sphinx的Coreseek搜索服務。

    下載安裝步驟【本人采用 linux環境下 4.1版本,系統支持mysql和xml數據源】:

  1.  coreseek下載地址,下載 coreseek-4.1-beta.tar.gz

    </li>

  2.   解壓gz包,tar zxvf coreseek-4.1-beta.tar.gz

    </li>

  3.  編譯安裝 mmseg【中文分詞包】

    </li>

    1. ./bootstrap

      </li>

    2. ./configure --prefix=/usr/local/mmseg3 

      </li>

    3. make && make install

      </li> </ol>

    4.  編譯安裝 coreseek 

      </li>

      1. sh buildconf.sh  #輸出的warning信息可以忽略,如果出現error則需要解決 

        </li>

      2. ./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  #with-mmseg-libs就是mmseg中文分詞路徑

        </li>

      3. make && make install

        </li> </ol> </ol>

            電影網站更新周期比較長,sphinx采用主索引+增量索引方式進行索引,最后合并兩個索引文件。下面開始部署自己的搜索配置文件:

        1. 進入coreseek安裝目錄下的etc文件,新建或修改 .conf配置文件

          </li>

        2. 配置source源 

          </li>

          1. source movie
            {
                type              = mysql
                sql_host        = localhost #mysql數據庫host
                sql_user        = root    #mysql用戶
                sql_pass        =           #mysql用戶密碼
                sql_db          = movie  #movie
                sql_port        = 3306   # optional, default is 3306
                sql_query_pre            = SET NAMES utf8
              
                #建立增量索引 
                sql_query_pre = REPLACE INTO movie_sph_counter SELECT 1, MAX(id) FROM movie
                sql_query = SELECT id, UNIX_TIMESTAMP(cdate) AS date ,id AS movie_id ,name, year, type,status,sync_status FROM movie WHERE id<=( SELECT max_movie_id FROM movie_sph_counter WHERE counter_id=1 )

               #搜索返回字段
                sql_attr_uint   = movie_id
                sql_attr_uint   = year
                sql_attr_uint   = type
                sql_attr_uint   = date
                sql_attr_uint   = status
                sql_attr_uint   = sync_status                   
                sql_field_string = name

                sql_query_info_pre      = SET NAMES utf8                                        #命令行查詢時,設置正確的字符集
                sql_query_info            = SELECT * FROM movie WHERE id=$id #命令行查詢時,從數據庫讀取原始數據信息
            }

            #增量索引源
            source delta : movie
            {
                sql_query_pre = SET NAMES utf8
                sql_query = SELECT id, UNIX_TIMESTAMP(cdate) AS date ,id AS movie_id ,name , year, type ,status,sync_status FROM movie WHERE id>( SELECT max_movie_id FROM movie_sph_counter WHERE counter_id=1 )
                sql_query_post_index =  REPLACE INTO movie_sph_counter SELECT 1, MAX(id) FROM movie
            }

            </li> </ol>

          2. 配置索引

            </li>

            1. #index定義
              index movie
              {
                  source            = movie            #對應的source名稱
                  path              = /usr/local/coreseek/var/data/movie #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
                  docinfo            = extern
                  mlock            = 0
                  morphology        = none
                  min_word_len        = 1
                  html_strip                = 0

                  #中文分詞配置,詳情請查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
                  charset_dictpath = /usr/local/mmseg/etc/ #BSD、Linux環境下設置,/符號結尾  mmseg路徑
                
                  charset_type        = zh_cn.utf-8  #中文編碼
              }

              index delta : movie
              {
                  source = delta
                  path            = /usr/local/coreseek/var/data/movie_delta   #注意!!不要和主索引路徑名稱一樣

                  docinfo         = extern
                  mlock           = 0
                  morphology      = none
                  min_word_len    = 1
                  html_strip      = 0

                  charset_dictpath = /usr/local/mmseg/etc/
                  charset_type     = zh_cn.utf-8
              }

              </li> </ol>

            2.  配置搜索服務 

              </li>

              1. #searchd服務定義
                searchd
                {
                    listen                  =   9312  #端口號,可以自己定義
                    read_timeout        = 5
                    max_children        = 30
                    max_matches            = 1000
                    seamless_rotate        = 0
                    preopen_indexes        = 0
                    unlink_old            = 1
                    
                    compat_sphinxql_magics=0
                    pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid  #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
                    log = /usr/local/coreseek/var/log/searchd_mysql.log        #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
                    query_log = /usr/local/coreseek/var/log/query_mysql.log #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
                    binlog_path =                                #關閉binlog日志
                }

                </li> </ol>

              2. 執行命令建立索引:  /usr/local/coreseek/bin/indexer -c movie.conf --all

                </li>

              3. 后臺開啟搜索服務運行:/usr/local/coreseek/bin/searchd  -c movie.conf

                </li>

              4. 建立定時任務,執行增量索引:/usr/local/coreseek/bin/indexer -c csft_movie.conf delta --rotate

                </li>

              5. 建立定時任務,合并索引:/usr/local/coreseek/bin/indexer -c csft_movie.conf --merge movie delta --merge-dst-range deleted 0 0 --rotate

                </li>

              6. 至此基于sphinx+mysql的搜索服務已經搭建完畢,接下來就是根據sphinxapi.php開發搜索接口代碼……

                </li> </ol>

                    第一次自己搭建sphinx搜索服務,最后測試網站搜索,速度杠杠的。

                    特此分享,希望對大家有所幫助



 本文由用戶 CecileCerva 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!