首頁  >  文章  >  後端開發  >  coreseek配置以及增量索引合併索引

coreseek配置以及增量索引合併索引

不言
不言原創
2018-05-15 14:56:012011瀏覽


引導:本人是個php菜鳥,公司的業務並不繁瑣,但是最近使用到了全文搜索,就想著用sphinx。
大致分為三個部分,1:安裝;2配置:3調用api 。這裡主要說一下配置及呼叫api。安裝的步驟我之前單獨寫了一個帖子可以去看看,如果不太明白可以去官網,安裝步驟說的很清楚,廢話不多說,開始。
一、為什麼要用增量索引?其實我個人認為對資料量小的業務來說用增量索引完全沒有必要。可以定時重新產生索引就OK了。增量索引就是對 截至上次產生的索引以後新增的內容單獨產生索引,這樣資料量比較小,且不影響業務處理,然後定期進行索引合併,為了保持資料統一性,還需要定期從新產生索引。
1、上次產生索引的id需要記錄下來,可以用一張表來儲存。

CREATE TABLEtbl_pre_coursevideo( 
idint(11) NOT NULL DEFAULT '0', 
maxidint(11) NOT NULL DEFAULT '0', 
 PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、設定檔

source mysql
{
 type                    = mysql
    sql_host             = 127.0.0.1
    sql_user              = root
    sql_pass              = 123456
    sql_db                = test
    sql_port              = 3306
    sql_query_pre        = SETNAMES utf8
    sql_query_pre       = SETSESSION query_cache_type=OFF #如果这里报错去mysql配置文件修改
    sql_query_pre         = REPLACEINTO tbl_pre_coursevideo SELECT1, MAX(id) FROM tbl_coursevideo    #在刚才新建的表中将当前索引生成的最多id存起来,为增量索引做准备。


    sql_query                = SELECT id,title,create_time, subtitle,content,type FROM tbl_coursevideo WHERE id <=(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1)
   #上面这条sql可以分为两部分WHERE 之前,是对数据的查询(根据自己的业务来定)where之后,是对刚才的记录
   最大ID 的筛选

    sql_attr_uint            = id           #从SQL读取到的值必须为整数
     sql_attr_timestamp        = create_time #从SQL读取到的值必须为整数,作为时间属性


    sql_field_string          = title  #字符串字段(可全文搜索,可返回原始文本信息)  
     sql_field_string          = subtitle  #字符串字段(可全文搜索,可返回原始文本信息)  
     sql_field_string          = content  #字符串字段(可全文搜索,可返回原始文本信息)  
}
source increment : mysql
{
sql_query_pre = SETNAMES utf8
sql_query                = SELECT id,title,create_time, subtitle,content,type FROMtbl_coursevideo WHERE id >(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1)
#这是增量索引的数据源sql。和上面保持一致,唯一的变化,就是where条件之后,这里查询的是大于上次重新生成索引的id,即:刚刚添加的数据
}


#index定义
index mysql
{
   source            = mysql             #对应的source名称
    path            = /usr/local/coreseek/var/data/mysql#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo            = extern
    mlock            = 0morphology        = none
    min_word_len        = 1html_strip                = 0    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type        = zh_cn.utf-8}


index increment : mysql
{
  source=increment

    path            = /usr/local/coreseek/var/data/increment
    charset_dictpath = /usr/local/mmseg3/etc/
    charset_type    = zh_cn.utf-8}
#全局index定义
indexer
{
    mem_limit            = 128M
}


#searchd服务定义
searchd
{
    listen                  =   9312read_timeout        = 5max_children        = 30max_matches            = 1000seamless_rotate        = 0preopen_indexes        = 0unlink_old            = 1    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/...


}

使用:
1、產生索引(一下指令都是我自己的安裝環境路徑,具體的修改成自己的)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all  #產生索引
這時tbl_pre_coursevideo 表裡會增加一筆記錄。存放的就是你內容表中的最大id

2、
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf       #開啟後台進程


mysql資料來源進行搜尋的話其實已經是有資料的。
3、增量索引(內容表新增資料的前提) /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf   increment --rotate
#執行完成以後會提示產生幾個增量索引數據,也就是你剛才在內容表中新增的資料條數。這時候其實可以測試你的增量索引成功沒cl->Query($keyword, 'increment ');呼叫api時可以用增量索引查詢你剛加入的內容

4、合併索引


usr/ local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf

–merge mysql increment  –rotate

cl->Query(&#39;查询的关键字&#39;, &#39;mysql&#39;); //就能查询出来刚才的新添加的数据,以及以前的数据。

5、為了保持資料統一,還需要定時從新生成索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate#--rotate 是不影响服务器搜索时可以添加这个属性

二、

1、調用api,這是我自己封裝的,sphinxapi.php安裝完成的檔案裡有這個類別

require&#39;sphinxapi.php&#39;;

class Sphinx {private$host=&#39;127.0.0.1&#39;;private$port=9312;private$cl;/*
     * @desc 构造函数  初始化sphinx对象
     */public function __construct() {$this->cl =new SphinxClient ();$this->cl->SetServer($this->host, $this->port);$this->cl->SetConnectTimeout(1);$this->cl->SetArrayResult(true);$this->cl->SetMatchMode(SPH_MATCH_EXTENDED2);$this->cl->SetRankingMode(SPH_RANK_WORDCOUNT);
    }/*
     * @desc 搜索
     * @param $page  页数
     * @param $pagesize  条数
     * @param $keyword  搜索关键字
     * @param $source 索引源
     */public function search($keyword, $p, $pagesize) {$page= ($p-1) *10;$this->cl->SetLimits($page, $pagesize); //分页$res=$this->cl->Query($keyword, $source); //sphinx 查询    }
  }

2、定時任務
yum install crontab  //安裝
crontab -e           //開啟編輯

然後定時執行增量索引,合併索引,從新生成索引

但是查詢出來的資料一直為空,那你就看看設定檔那

 path            = /usr/local/coreseek/var/data/increment#这里的配置,主索引是否和增量索引这只的路径一样,increment 就是索引的文件名,会在data文件夹下。

至此就講了。如果有什麼不會的,把這篇部落格好好看看,包括註釋,這都是我遇到的一些問題,都給註釋了起來。如果有什麼不懂的地方也可以給我留言,知無不盡。下次跟大家講一講分詞哪一塊。

&#39;).addClass(&#39;pre-numbering&#39;).hide();
                    $(this).addClass(&#39;has-numbering&#39;).parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($(&#39;
&#39;).text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn