sphinx主索引,增量索引创建

相关命令及步骤

创建主索引:
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all

创建增量索引:

    1. 创建测试数据表以及数据

    2. 修改配置文件
        主索引源:sql_query_pre
        增量索引源:sql_query_pre  sql_query  sql_query_post
        主索引:source path
        增量索引:source path

   3. 创建/更新主索引

   4. 创建/更新增量索引

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


   5.重启索引进程
    /usr/local/coreseek/bin/searchd  --stop
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf

索引合并
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --merge main delta --rotate
csft.conf
    配置文件
    source src1
    {
        type  = mysql
        sql_host = 127.0.0.1
        sql_user = root
        sql_pass =
        sql_db  = test
        sql_port  = 3306  # optional, default is 3306
        sql_query_pre  = SET NAMES utf8
        sql_query_pre  = REPLACE INTO sph_counter     SELECT 1, MAX(id) FROM documents
        sql_query   = \
            SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
  FROM documents
        sql_attr_uint  = group_id
        sql_attr_timestamp = date_added
        sql_query_info  = SELECT * FROM documents WHERE id=$id
    }
 index test1
    {
        source          = src1
        path            = /usr/local/coreseek/var/data/test1
        docinfo      = extern
        mlock           = 0
         morphology      = none
         stopwords       = /usr/local/coreseek/var/data/test1/stopwords.txt
         wordforms     = /usr/local/coreseek/var/data/test1/wordforms.txt
         min_word_len    = 1
         charset_type    = sbcs
         html_strip      = 0
}
 source delta : src1
    {
     sql_query_pre = SET NAMES utf8
     sql_query = SELECT \id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents \ WHERE \ id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
     sql_query_post = UPDATE sph_counter SET max_doc_id=(SELECT MAX(id) FROM documents) where counter_id=1
}


index delta : test1
    {
     source = delta
     path = /usr/local/coreseek/var/data/test1

  }

创建mysql测试数据表及数据

CREATE TABLE `documents` (`id` int(11) NOT NULL auto_increment,`group_id` int(11) NOT NULL,`group_id2` int(11) NOT NULL,`date_added` datetime NOT NULL,`title` varchar(255) NOT NULL,`content` text NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5;



INSERT INTO `documents` VALUES ('1', '1', '5', '2008-09-13 21:37:47', 'test one', 'this is my test document number one.also checking search within phrases.');

INSERT INTO `documents` VALUES ('2', '1', '6', '2008-09-13 21:37:47', 'test two', 'this is my test document number two');

INSERT INTO `documents` VALUES ('3', '2', '7', '2008-09-13 21:37:47', 'another doc', 'this is another group');INSERT INTO `documents` VALUES ('4', '2', '8', '2008-09-13 21:37:47', 'doc number four', 'this is to test groups');

    // 实现增量索引时使用的计数表


CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL);

PHP使用

    <?php


    header("Content-type: text/html; charset=utf-8");


    require_once('sphinxapi.php');


    $s = new SphinxClient();


    $s->setServer("127.0.0.1", 9312);

    $s->setArrayResult(true);

    $s->setMatchMode(SPH_MATCH_ALL);


    $keyword = 'test';


    $result = $s->Query($keyword, '*');

    if ($result['total'] == 0) {

        echo '无搜索结果';die;

    }


    // 获取结果id集


    $ids = array();

    foreach($result['matches'] as $key => $val)
    {

        $ids[] = $val['id'];

    }

    print_r($ids);


    // 连接数据库

    $dsn = "mysql:host=localhost;dbname=test;charset=utf8";

    $db = new PDO($dsn, 'root', '');

    $sql = 'select * from documents where id in('.implode(',', $ids).')';

    $result = $db->query($sql);

    $result->setFetchMode(PDO::FETCH_ASSOC);


    $data = $result->fetchAll();

    // 搜索结果高亮显示

    $rule = array(

                "before_match" => "<font style='font-weight:bold;color:#f00'>",

                "after_match" => "</font>"
                );

    foreach ($data as $key=>$val) {

        $data[$key] = $s->BuildExcerpts($val, 'delta', $keyword, $rule);

    }


    print_r($data);

添加新分词

1. 复制unigram.txt文件为unigram_new.txt

2. 在unigram_new.txt中添加新词

3. 生成新的词典文件:/usr/local/mmseg3/bin/mmseg -u /usr/local/mmseg3/etc/unigram_new.txt

4. 替换原有的uni.lib文件

5. 重建索引 && 重启索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的全文索引底层原理是基于倒排索引的。在MySQL中,全文索引只支持英文,如果需要对中文进行全文检索,可以使用sphinx的中文版(coreseek)。 底层原理包括MySQL缓冲池、索引的底层原理、页分裂与页合并、B树的优势以及索引操作等。 MySQL缓冲池是用于管理数据页的,包括数据页与数据页管理、free链表、flush链表、哈希表以及LRU链表。 索引的底层原理分为InnoDB索引和MyISAM索引。InnoDB索引包括行记录与页内索引、页外索引页、B树结构、聚簇索引以及InnoDB索引文件。而MyISAM索引包括聚簇索引VS非聚簇索引以及MyISAM索引文件。 页分裂与页合并是指当索引数据页满了之后,需要进行分裂操作,将数据分散到新的数据页中,或者当数据删除时,页空间过多时需要进行合并操作,将数据整理到更少的页中。 B树是一种常用的索引数据结构,相比于其他数据结构如AVL树、红黑树、哈希表和跳表,B树具有较好的平衡性和高效的插入、删除和查找性能,因此被广泛应用于索引中。 索引操作包括创建索引、删除索引、查看索引、全文索引和复合索引最左匹配原则等。创建索引默认键,删除索引是指删除已经创建索引,查看索引可以使用EXPLAIN语句来查看索引的使用情况。全文索引用于对文本内容进行全文检索,而复合索引最左匹配原则是指在复合索引中,只有最左边的列被使用时索引才会生效。 综上所述,MySQL的全文索引底层原理是基于倒排索引的,具体包括MySQL缓冲池、索引的底层原理、页分裂与页合并、B树的优势以及索引操作等方面的内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MYSQL索引底层原理](https://blog.csdn.net/winy1986/article/details/125758304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [详解MySQL索引与底层原理](https://blog.csdn.net/Wyf_Fj/article/details/126415270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值